用TensorFlow做Kaggle“手写识别”达到98%准确率-详解

一、回顾上期

上期我们学习了梯度下降、神经网络、损失函数、交叉熵等概念,然后用42000张图片数据训练了一个简单的神经网络,准确度92%。可以说,这只是一个Hello World。

用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第1张图片
Hello World

二、如何进行改进

首先,这次我们将使用卷积神经网络来进行图片识别。众所周知,卷积神经网络对于图片识别是非常有效的。

这里我打算这样来构建这个卷积神经网络:

卷积层1+池化层1+卷积层2+池化层2+全连接1+Dropout层+输出层

然而,什么是卷积神经网络?什么是卷积层、池化层、全连接层?Dropout又是什么鬼?

1 什么是卷积神经网络?

我们人看到一幅图像,眨眼之间就知道图像中有什么,图像中的主体在干什么。但计算机不同,计算机看到的每一副图像都是一个数字矩阵。那我们怎么让计算机从一个个数字矩阵中得到有用的信息呢,比如边缘,角点?更甚一点,怎么让计算机理解图像呢?

对图像进行卷积,就是接近目标的第一步。

图像在计算机里的表示可能是这样的:

用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第2张图片
一张图片

对图像卷积,就是求卷积核作用在图像后,得到的图像对于该卷积核的累加数值。这些累加的数值可以代表这个图片的一些特征。

如果是针对猫进行识别,人可能知道猫头,猫尾巴等特征。CNN对图片进行处理后,也会学习到一些特征,它可能不知道猫头、猫尾巴这些特征,但也会识别出一些我们可能看不出来的特征,CNN通过这些学习到的特征去做判断。

2 什么是卷积层?

卷积层的作用是指对图片的矩阵进行卷积运算,得到一些数值,作为图片的某些特征

3 什么是池化层?

池化曾的作用是对上层的数据进行采样,也就是只留下一部分,这样的作用是可以缩小数据量和模糊特征。

4 什么是全连接层?

全连接层就是连在最后的分类器。前面卷积层和池化层进行处理后,得到了很多的特征,全连接层使用这些特征进行分类。比如识别数字,那就是对0~9的十个类别进行分类。

5 Dropout是什么?

Dropout层是为了防止CNN对训练样本过拟合,而导致处理新样本的时候效果不好,采取的丢弃部分激活参数的处理方式。

这里对这些概念的解释都是比较简单的,如果希望详细了解,可以看知乎的这个链接:

CNN卷积神经网络是什么?

三、 代码实现

用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第3张图片
用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第4张图片
1 标签的处理
用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第5张图片
2 把数据分为训练集和验证集
用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第6张图片
3 定义处理数据的函数
用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第7张图片
4 定义网络的结构
用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第8张图片
5 定义各类参数
用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第9张图片
6 进行训练

四、生成结果

这里迭代20个周期:

用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第10张图片
7 验证集上的准确度

然后我们使用这个模型对Kaggle的测试集进行预测,并生成cvs格式的结果

用TensorFlow做Kaggle“手写识别”达到98%准确率-详解_第11张图片
8 生成结果

这里建议跑30轮以上,因为在验证集上有98.35%准确率,上传到Kaggle往往就只有百分之九十七点几的准确率了

你可能感兴趣的:(用TensorFlow做Kaggle“手写识别”达到98%准确率-详解)