一、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