【问题标题】:mnist database parsing cmnist数据库解析c
【发布时间】:2016-01-11 22:48:28
【问题描述】:

我正在尝试解析 MNIST 手写数字数据库。但是,当我查看使用 fread 时它给我的值时,它们是不正确的。我已经改变了字节顺序,但数值仍然不正确。数据库链接在这里:http://yann.lecun.com/exdb/mnist/

int ChangeEndianness(int value) {
    int result = 0;
    result |= (value & 0x000000FF) << 24;
    result |= (value & 0x0000FF00) << 8;
    result |= (value & 0x00FF0000) >> 8;
    result |= (value & 0xFF000000) >> 24;
    return result;
}

FILE *imageTestFiles = fopen("train-images-idx3-ubyte.gz","r");

if(imageTestFiles == NULL) {
    perror("File Not Found");
}
int magic_number_bytes;
fread(&magic_number_bytes, sizeof(int), 1, imageTestFiles);
printf("%d\n", ChangeEndianness(magic_number_bytes));

这一切都应该是打印“幻数”,即 2049 或 0x00000801,但它会打印 529205256,即 0x1F8B0808。我是 C 的新手,总是事先使用 Java。提前致谢!

【问题讨论】:

  • 您知道gz 扩展名表示数据文件已压缩,因此您必须先对其进行解压缩才能从中读取数据?
  • 还是不行。链接说的第一件事是下载时文件可能是 .gz 格式。当我将文件重新保存到我的编码项目中时,我摆脱了它,但它仍然打印了以 5 开头的相同大数字。所以,我只是将其切换回 .gz,因为我不知道出了什么问题。跨度>
  • 您可以在此处找到已解码的 MNIST 数据集版本:mnist-decoded.000webhostapp.com

标签: parsing endianness mnist


【解决方案1】:

文件必须首先解压缩,而不是简单地删除 gz 扩展名。

可以看出您的代码正在对压缩文件进行操作,因为0x1F8B 是 gzip 文件格式的幻数。

如果使用xxd显示下载后的文件内容,则得到观察到的0x1F8B0808

$ xxd -p train-images-idx3-ubyte.gz | head -c 8
1f8b0808

但是,如果你解压文件:

$ gunzip train-images-idx3-ubyte.gz
$ xxd -p train-images-idx3-ubyte | head -c 8
00000803

您将获得 MNIST 数据的预期幻数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2018-09-07
    • 2021-08-05
    相关资源
    最近更新 更多