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

使用javascript/node.js读取MNIST数据集,javascript,node.js,neural-network,mnist,Javascript,Node.js,Neural Network,Mnist,我正在尝试从以下来源解码数据集: 在底部有一个“非常简单”的IDX文件类型的描述,但我无法理解它 我想要达到的目标是: var imagesFileBuffer = fs.readFileSync(__dirname + '/train-images-idx3-ubyte'); var labelFileBuffer = fs.readFileSync(__dirname + '/train-labels-idx1-ubyte'); var pixelValues = {}; 变魔

我正在尝试从以下来源解码数据集:

在底部有一个“非常简单”的IDX文件类型的描述,但我无法理解它

我想要达到的目标是:

var imagesFileBuffer = fs.readFileSync(__dirname + '/train-images-idx3-ubyte');
var labelFileBuffer  = fs.readFileSync(__dirname + '/train-labels-idx1-ubyte');
var pixelValues      = {};
变魔术

像素值现在类似于:

// {
//   "0": [0,0,200,190,79,0... for all 784 pixels ... ],
//   "4": [0,0,200,190,79,0... for all 784 pixels ... ],

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

我意识到在我的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);
}
有28x28=784个像素值,所有像素值的范围从0到255不等


要渲染像素,请像上面一样使用我的for循环,渲染左上角的第一个像素,然后向右操作。

只是一个小小的改进:

for (var image = 0; image <= 59999; image++) {

如果您保持一致,并使用这些提取的数据(例如)训练神经网络,这些小细节就不会成为问题,因为您将对测试数据集执行相同的操作。但是,如果你想用MNIST训练的神经网络,并尝试用现实生活中的手写数字验证它,你会得到不好的结果,因为真实的图像没有翻转。

谢谢!编辑答案。:)@Lilleman我不想吹毛求疵,但你能解释一下为什么在代码中使用15字节的偏移量吗?我在MNIST网站上查看了数据格式,数据在0016的16字节偏移量之后开始。即使这是一个错误,也不会产生太大影响。再次感谢您的代码,它帮助我理解了MNIST数据格式。嗯。。。我不记得要诚实。但我想这与0是第一个字节,16是第一个数据字节有关。因此,0-15是前数据字节。不过,我可能在这一点上大错特错,所以如果您认为我应该切换到16,并且在代码中工作得更好,我将进行更改。非常感谢你的好话,总是乐于助人。:)@Lilleman我在自己编写代码的过程中添加了更多的建议出于某些原因,图像出现在侧面,我认为这与上述解决方案无关,而是与原始mnist数据有关
for (var image = 0; image <= 59999; image++) {
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 y = 0; y <= 27; y++) {
        for (var x = 0; x <= 27; x++) {
            pixels.push(dataFileBuffer[(image * 28 * 28) + (x + (y * 28)) + 16]);
        }
    }

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

    pixelValues.push(imageData);
}