【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的得分

这里写图片描述

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值