无法读取在具有相同代码的不同计算机上写入的文件
Can't read file written in a different machine with the same code
我有一个神经网络,我正试图在运行debian的远程VM中训练它。训练结束后,我把重量保存在一个txt文件中,然后把这个文件下载到我的电脑(Ubuntu 14)上。问题是我无法读取weights文件(它加载了错误的值),即使我可以在远程机器中使用相同的代码读取它。这是我的代码:
用于阅读:
void CNN::LoadWeights(char *fileName) {
int i, j, k, m;
FILE *f;
if((f = fopen(fileName, "r")) == NULL) return;
for ( i=1; i<CNNSize; i++ ) {
for( j=0; j<CNNLayers[i].FMCount; j++ ) {
fscanf(f, "%f ", &CNNLayers[i].FeatureMaps[j].bias);
for(k=0; k<CNNLayers[i].prevLayer->FMCount; k++) {
for(m=0; m < CNNLayers[i].KernelSize * CNNLayers[i].KernelSize; m++) {
fscanf(f, "%f ", &CNNLayers[i].FeatureMaps[j].kernel[k][m]);
}
}
}
}
fclose(f);
}
用于书写:
void CNN::SaveWeights(char *fileName) {
int i, j, k, m;
FILE *f;
if((f = fopen(fileName, "w")) == NULL) return;
for ( i=1; i<CNNSize; i++ ) {
for( j=0; j<CNNLayers[i].FMCount; j++ ) {
fprintf(f, "%f ", CNNLayers[i].FeatureMaps[j].bias);
for(k=0; k<CNNLayers[i].prevLayer->FMCount; k++) {
for(m=0; m < CNNLayers[i].KernelSize * CNNLayers[i].KernelSize; m++) {
fprintf(f, "%f ", CNNLayers[i].FeatureMaps[j].kernel[k][m]);
}
}
}
}
fclose(f);
}
您的读取函数应该是
fscanf(f, "%lf ", &CNNLayers[i].FeatureMaps[j].bias);
for(k=0; k<CNNLayers[i].prevLayer->FMCount; k++) {
for(m=0; m < CNNLayers[i].KernelSize * CNNLayers[i].KernelSize; m++) {
fscanf(f, "%lf ", &CNNLayers[i].FeatureMaps[j].kernel[k][m]);
}
}
请注意,格式是"%lf"
,而不是"%f"
。在printf
中,值会自动从float
转换为double
,因此%f
适用于float
和double
,但在fscanf
中,%f
意味着float
,因此您的数据以错误的格式读取,最重要的是,将数据作为float
存储到double
的指针中。使用%lf
将向fscanf
指示您要将其读取为double
。
如果您将-Wformat
添加到编译行(或者更好的是-Wall -Werror
),它应该会沿着"fscanf argument 1 expects float,give double"的行向您发出警告/错误,您应该注意这个警告并相应地修复代码。
为了确保您的输入正确工作,请使用:
void input_error()
{
fprintf(stderr, "Error reading input");
exit();
}
...
if (fscanf(f, "%lf ", &CNNLayers[i].FeatureMaps[j].bias) != 1)
{
input_error();
}
第2版:您可能需要删除格式中的空格(换句话说,"%lf
"instead of
"%lf", as my experience with spaces in
fscanf formats is that they are "not doing what you want, most of the time", and
fscanf`将根据需要在实际输入之前跳过空格,因此您应该在没有空格的情况下至少获得同样好的结果。
相关文章:
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 预处理的 C/C++ 文件是否特定于计算机?
- Arduino Makefile:如何将传感器数据保存到计算机中的文件中
- 在计算机之间使用C 传输文件
- 将Visual Studio C 构建的中间文件移至另一台计算机
- 计算机中的文件组织/位置
- C++Qt可执行文件与所有Windows计算机兼容
- 从另一台计算机运行opencv可执行文件
- 正在读取计算机中的所有文件
- 通过网络直接从另一台计算机的内存中读取文件
- 在具有C++的计算机之间发送文件
- 如何引用要以C++打开的文件,因为其完整路径名将因计算机而异
- 以编程方式在非 Windows 计算机中创建共享文件夹
- 在 Linux 计算机中使用套接字发送和接收文件时C++问题
- 在其他计算机 MVCP100d 中打开 EXE 需要什么文件
- 我需要使用 ext4 文件以编程方式获取和设置 Ubuntu 14.04 台式计算机的 ACL(访问控制列表)
- 两台计算机必须有什么共同点才能运行相同的可执行文件
- 在计算机中递归搜索文件
- 使用特定于计算机的“.file”路径 - CUDA .ptx 文件是否可移植