使用 R 加载 MNIST 数字识别数据集并查看任何结果

Posted

技术标签:

【中文标题】使用 R 加载 MNIST 数字识别数据集并查看任何结果【英文标题】:Load the MNIST digit recognition dataset with R and see any results 【发布时间】:2018-08-02 09:02:13 【问题描述】:

在“Machine Learning - A Probabilistic Perspective" by Kevin P. Murphy”一书中,第一个任务是:

在 shuffled MNIST 数据上练习 1.1 KNN 分类器

运行 mnist1NNdemo 并验证错误分类率(在前 1000 个测试中) 例)1-NN 分类器的 MNIST 为 3.8%。 (如果你全部运行 所有10,000个测试用例,错误率为3.09%。)修改代码 你首先随机排列特征(训练的列 和测试设计矩阵),如在 shuffledDigitsDemo 中,然后应用 分类器。验证错误率没有改变。

我的简单理解是,练习是在加载文件后寻找 1-NN(R 中的 kNN())。

文件:

train-images-idx3-ubyte.gz:训练集图片(9912422字节)

train-labels-idx1-ubyte.gz:训练集标签(28881字节)

t10k-images-idx3-ubyte.gz:测试集图片(1648877字节)

t10k-labels-idx1-ubyte.gz:测试集标签(4542字节)

取自The MNIST DATABASE

我找到了一个 popular template 用于加载文件:

# for the kNN() function 
library(VIM)
load_mnist <- function() 
  load_image_file <- function(filename) 
   ret = list()
    f = file(filename,'rb')
    readBin(f,'integer',n=1,size=4,endian='big')
    ret$n = readBin(f,'integer',n=1,size=4,endian='big')
    nrow = readBin(f,'integer',n=1,size=4,endian='big')
    ncol = readBin(f,'integer',n=1,size=4,endian='big')
    x = readBin(f,'integer',n=ret$n*nrow*ncol,size=1,signed=F)
    ret$x = matrix(x, ncol=nrow*ncol, byrow=T)
    close(f)
    ret
  
  load_label_file <- function(filename) 
    f = file(filename,'rb')
    readBin(f,'integer',n=1,size=4,endian='big')
    n = readBin(f,'integer',n=1,size=4,endian='big')
    y = readBin(f,'integer',n=n,size=1,signed=F)
    close(f)
    y
  
  train <<- load_image_file("train-images.idx3-ubyte")
  test <<- load_image_file("t10k-images.idx3-ubyte")
   
  train$y <<- load_label_file("train-labels.idx1-ubyte")
  test$y <<- load_label_file("t10k-labels.idx1-ubyte")  


show_digit <- function(arr784, col=gray(12:1/12)) 
  image(matrix(arr784, nrow=28)[,28:1], col=col)

根据评论,在命令行中这应该可以工作:

  # Error "Error in matrix(arr784, nrow = 28) : object 'train' not found"
  show_digit(train$x[5,])

问题是如何使用 show_digit 函数?


编辑删除多余的问题

【问题讨论】:

【参考方案1】:

我发现问题的原因:

首先在 R Studio 或 ESS 中运行整个文件,然后从控制台调用 load_mnist()。 之后再次在控制台中执行show_digit(train$x[3,]),它就可以工作了。

可以在整个数据集上找到 KNN 分类器: a &lt;- knn(train, test, train$y) 但这将是一个非常缓慢的过程。

可以像table(test$y, a)一样对结果进行预测,test$y是预测的,a是实际结果。

【讨论】:

以上是关于使用 R 加载 MNIST 数字识别数据集并查看任何结果的主要内容,如果未能解决你的问题,请参考以下文章

CNN-mnist手写数字识别

数据挖掘入门系列教程之使用神经网络(基于pybrain)识别数字手写集MNIST

[Pytorch系列-40]:卷积神经网络 - 模型的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别

[Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别

PyTorch基于CNN的手写数字识别(在MNIST数据集上训练)

深度学习笔记:基于Keras库的MNIST手写数字识别