MNIST手写数字数据集总结

MNIST手写数字数据集总结

  1. 一共有60000张训练样本,10000张测试样本
  2. 这些数字图像都已经标准化成一个固定像素大小的图像(28x28px)。
  3. 这些图像文件并没有什么格式,打不开,而且是二进制文件,记事本打开会出现乱码,必须自己手写代码打开。
  4. 下载地址在这里:

训练图像(约10MB)

训练标签(约29KB)

测试图像(约1.6MB)

测试标签(约4.5KB)

  1. 这里说明一下其格式:当下载好压缩包后,每个压缩包解压后只有一个文件,所有的图像或者标签都集中在那里面,而且文件必须解压后才能使用。

train-images-idx3-ubyte

  • 4字节的magic number(应该是作为读入校验使用的,其值为2051)
  • 4字节的图像总数(一共60000个)
  • 4字节的图像高度(28)
  • 4字节的图像宽度(28)
  • 28x28字节的第一个图像信息
  • 28x28字节的第二个图像信息

………

可以用一个28x28字节的unsigned char类型数组接收图像信息,在终端打印出来的效果如下:

MNIST手写数字数据集总结_第1张图片

train-labels-idx1-ubyte

  • 4字节的magic number(2049)
  • 4字节的标签总数(一共60000个)
  • 1字节的第一个标签信息
  • 1字节的第二个标签信息

………

其中,标签信息为0~9

MNIST手写数字数据集总结_第2张图片

我用C++实现的,代码坑比较多,因此最好先看懂我的代码,然后再使用:

#include "iostream"
#include "stdio.h"
#include "stdlib.h"
using namespace std;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;

struct Image
{
    BYTE array[28][28];
    Image(BYTE array[28][28])
    {
        for(int i=0; i<28; i++)
            for(int j=0; j<28; j++)
                this->array[i][j] = array[i][j];
    }
};

class MNIST
{
protected:
    DWORD magic_number;
    DWORD count;

protected:
    DWORD reverse(DWORD &num) // 从文件里读取的数是倒着的,因此需要翻转一下
    {
        int res = 0;
        for(int i=0; i<4; i++)
        {
            res = res << 8;
            unsigned char tc = num >> i*8; 
            res |= tc;
        }
        return num = res;
    }

public:
    void virtual printInfo()=0;
    void virtual printData(int n=0)=0;
};

class MNIST_Image: public MNIST
{
    DWORD rows;
    DWORD columns;
    Image* images[60000];

public:
    MNIST_Image(char* filepath)
    {
        FILE *fp;
	    fp=fopen(filepath,"rb");
        if(fp != NULL){
            fread(&magic_number,1,4,fp); reverse(magic_number);
            fread(&count,1,4,fp); reverse(count);
            fread(&rows,1,4,fp); reverse(rows);
            fread(&columns,1,4,fp); reverse(columns);
            for(int i=0; i<60000; i++)
            {
                BYTE arr_t[28][28];
                fread(&arr_t, 1, sizeof(BYTE)*28*28, fp);
                images[i] = new Image(arr_t);
            }
        }
        else cout <<"[error]: file open failed" <array[i][j]+0);
            cout << endl;
        }
    }
};

class MNIST_Label: public MNIST
{
    BYTE labels[60000];
    
public:
    MNIST_Label(char* filepath)
    {
        FILE *fp;
	    fp=fopen(filepath,"rb");
        if(fp != NULL)
        {
            fread(&magic_number,1,4,fp); reverse(magic_number);
            fread(&count,1,4,fp); reverse(count);
            for(int i=0; i<60000; i++)
            {
                BYTE item_t;
                fread(&item_t, 1, sizeof(BYTE), fp);
                labels[i] = item_t;
            }
        }
        else cout <<"[error]: file open failed" <

你可能感兴趣的:(C语言)