【R语言】kaggle-CNN手写数据集识别



一、Kaggle的任务描述

kaggle-CNN手写数据集下载 网址

  MNIST(“国家标准与技术研究院修改版”)是计算机视觉领域的“hello world”数据集。训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.
  数据文件train.csv和test.csv包含从零到九的手绘数字的灰度图像。每张图像的高度为28像素,宽度为28像素,总共为784像素。每个像素都有一个与之相关的像素值,表示该像素的亮度或暗度,较高的数字意味着较暗。此像素值是一个介于0和255之间的整数,包括0和255。
  训练数据集(train.csv)有785列。称为“标签”的第一列是由用户绘制的数字。其余列包含关联图像的像素值。
  训练集中的每个像素列都有一个像pixelx这样的名称,其中x是0到783之间的整数,包括0和783之间的整数。为了在图像上定位这个像素,假设我们已经将x分解为x = i * 28 + j,其中i和j是0到27之间的整数,包括0和27。然后,pixelx位于28 x 28矩阵的第i行和第j列(索引为零)。
  例如,像素31指示位于2行4列的位置。在视觉上,如果我们省略“像素”前缀,则像素组成如下图像:

000 001 002 003 … 026 027
028 029 030 031 … 054 055
056 057 058 059 … 082 083
 |  |   |  |  …  |   |
728 729 730 731 … 754 755
756 757 758 759 … 782 783

  测试数据集(test.csv)与训练集相同,只是它不包含“标签”列。您的提交文件应采用以下格式:对于测试集中的每个28000图像,输出一行,其中包含ImageId和您预测的数字。 例如,如果您预测第一张图像是3,第二张图像是7,第三张图像是8,那么您的提交文件将如下所示:

ImageId  ,  Label
  1     ,    3
  2     ,    7
  3     ,    8
(27997 more lines)


二、卷积神经网络结构

这里写图片描述


三、深度学习库mxnet的安装

#下载安装 
cran <- getOption("repos")  
cran["dmlc"] <- "https://s3-us-west-2.amazonaws.com/apache-mxnet/R/CRAN/"  
options(repos = cran)  
install.packages("mxnet")  

四、源代码

library(mxnet)  
#加载数据 
train <- read.csv("train.csv")  
test <- read.csv("test.csv")  

# Set up train and test datasets 
train <- data.matrix(train)#变成矩阵 
train_x <- t(train[, -1])#除第一列以外都作为输入值  
train_y <- train[, 1]#目标列  
train_array <- train_x  
dim(train_array) <- c(28, 28, 1, ncol(train_x))#创建三维数组,因为手写图片是黑白图片,且大小为28*28的矩阵,一列代表一个数字,一共有ncol(train_x)数字  
test_x <- t(test)  
test_array <- test_x  
dim(test_array) <- c(28, 28, 1, ncol(test_x))  

#画个图 
plot.digit<-function(x){  
  train.plot<-t(train[x,-1])#x代表画第几个图片  
  train.plot2<-matrix((train.plot),ncol=28)#变成矩阵形式  
  image(train.plot2,col=grey.colors(225),axes=F)  
}  

data <- mx.symbol.Variable('data')#把数据变成mx规定的格式 

# 第一层卷积层 
conv_1 <- mx.symbol.Convolution(data = data, kernel = c(5, 5), num_filter = 20)#kernael就是filter,num_filter表示filter个数 
tanh_1 <- mx.symbol.Activation(data = conv_1, act_type = "tanh") 
#数据来自于卷积层,act_type激活函数为非线性函数即双曲正切函数 
pool_1 <- mx.symbol.Pooling(data = tanh_1, pool_type = "max", kernel = c(2, 2), stride = c(2, 2)) 
#池化层,数据来自非线性激活函数,pool_type="max"最大池化法,stride表示移动步长 

# 第二层卷积 
conv_2 <- mx.symbol.Convolution(data = pool_1, kernel = c(5, 5), num_filter = 50)#护具来自第一层的池化层 
tanh_2 <- mx.symbol.Activation(data = conv_2, act_type = "tanh")
pool_2 <- mx.symbol.Pooling(data=tanh_2, pool_type = "max", kernel = c(2, 2), stride = c(2, 2)) 

# 第一层全连接 
flatten <- mx.symbol.Flatten(data = pool_2)#Flatten将矩阵变成一个向量,数据来自于第二层池化层 
fc_1 <- mx.symbol.FullyConnected(data = flatten, num_hidden = 500)#全连接,全连接的数据来自上一层的flatten 
tanh_3 <- mx.symbol.Activation(data = fc_1, act_type = "tanh")#加一层非线性激活函数,数据来自上一层的全连接 

# 第二层全连接 
fc_2 <- mx.symbol.FullyConnected(data = tanh_3, num_hidden = 40)#来自上层非线性的结果 
#输出,因为这是多分类问题,所以用softmax函数 
NN_model <- mx.symbol.SoftmaxOutput(data = fc_2) 

# 设置种子,使结果具备可重复性 
mx.set.seed(100)  

# 使用cpu设备 
devices <- mx.cpu()  

# 训练 
model <- mx.model.FeedForward.create(NN_model,  
                                     X = train_array,  
                                     y = train_y,  
                                     ctx = devices,#设备  
                                     num.round = 25,#迭代次数  
                                     array.batch.size = 40,#批处理规模  
                                     learning.rate = 0.01,#学习率  
                                     momentum = 0.9,#当误差平面趋近于平面的话加快计算速度  
                                     eval.metric = mx.metric.accuracy,#评价指标  
                                     epoch.end.callback = mx.callback.log.train.metric(100))#回调函数,观察程序运行情况  

#测试 
predicted <- predict(model, test_array)  
predicted_labels <- max.col(t(predicted)) - 1  
res<-data.frame(ImageId=seq(1:length(predicted_labels)),Label=predicted_labels) 
write.csv(res,"Submission.csv",row.names = F) 
训练过程
Start training with 1 devices [1] Train-accuracy=0.816920877025744 [2] Train-accuracy=0.974309523809531 [3] Train-accuracy=0.978547619047627 [4] Train-accuracy=0.983380952380959 [5] Train-accuracy=0.987619047619054 [6] Train-accuracy=0.989523809523814 [7] Train-accuracy=0.991047619047624 [8] Train-accuracy=0.992928571428575 [9] Train-accuracy=0.993142857142861 [10] Train-accuracy=0.995238095238098 [11] Train-accuracy=0.996857142857144 [12] Train-accuracy=0.997761904761906 [13] Train-accuracy=0.998095238095239 [14] Train-accuracy=0.998904761904763 [15] Train-accuracy=0.998333333333334 [16] Train-accuracy=0.998976190476191 [17] Train-accuracy=0.998976190476191 [18] Train-accuracy=0.998714285714286 [19] Train-accuracy=0.9995 [20] Train-accuracy=0.999785714285714 [21] Train-accuracy=0.999928571428571 [22] Train-accuracy=0.99997619047619 [23] Train-accuracy=1 [24] Train-accuracy=1 [25] Train-accuracy=1

五、Kaggle的得分

这里写图片描述