使用javascript/node.js读取MNIST数据集

Lil*_*man 4 javascript neural-network node.js mnist

我正在尝试从此源解码数据集:http://yann.lecun.com/exdb/mnist/

底部有一个"非常简单"的IDX文件类型的描述,但我无法弄明白.

我想要实现的是:

var imagesFileBuffer = fs.readFileSync(__dirname + '/train-images-idx3-ubyte');
var labelFileBuffer  = fs.readFileSync(__dirname + '/train-labels-idx1-ubyte');
var pixelValues      = {};
Run Code Online (Sandbox Code Playgroud)

做魔法

pixelValues现在像:

// {
//   "0": [0,0,200,190,79,0... for all 784 pixels ... ],
//   "4": [0,0,200,190,79,0... for all 784 pixels ... ],
Run Code Online (Sandbox Code Playgroud)

等数据集中的所有图像条目.我试图找出二进制文件的结构,但失败了.

Lil*_*man 9

我意识到在pixelValues对象的结构中会有重复的键,所以我创建了一个对象数组.以下代码将创建我之后的结构:

var dataFileBuffer  = fs.readFileSync(__dirname + '/train-images-idx3-ubyte');
var labelFileBuffer = fs.readFileSync(__dirname + '/train-labels-idx1-ubyte');
var pixelValues     = [];

// It would be nice with a checker instead of a hard coded 60000 limit here
for (var image = 0; image <= 59999; image++) { 
    var pixels = [];

    for (var x = 0; x <= 27; x++) {
        for (var y = 0; y <= 27; y++) {
            pixels.push(dataFileBuffer[(image * 28 * 28) + (x + (y * 28)) + 15]);
        }
    }

    var imageData  = {};
    imageData[JSON.stringify(labelFileBuffer[image + 8])] = pixels;

    pixelValues.push(imageData);
}
Run Code Online (Sandbox Code Playgroud)

pixelValues的结构现在是这样的:

[
    {5: [28,0,0,0,0,0,0,0,0,0...]},
    {0: [0,0,0,0,0,0,0,0,0,0...]},
    ...
]
Run Code Online (Sandbox Code Playgroud)

有28x28 = 784个像素值,均在0到255之间变化.

要渲染像素,像我上面那样使用for for循环,渲染左上角的第一个像素,然后向右移动.