4用TensorFlow做Kaggle“手写识别”达到98%准确

作者: 西瓜量化 | 来源:发表于2017-10-01 21:28 被阅读3769次

    这是一个TensorFlow的系列文章,本文是第三篇,在这个系列中,你讲了解到机器学习的一些基本概念、TensorFlow的使用,并能实际完成手写数字识别、图像分类、风格迁移等实战项目。

    文章将尽量用平实的语言描述、少用公式、多用代码截图,总之这将是一份很赞的入门指南。欢迎分享/关注。

    上一期,我们用Tensorflow实现了Kaggle的手写识别项目,但准确率比较低,只有92%,这次我们打算把识别的准确率提升到98%以上。

    为什么不是上次说的提升到99%以上呢?因为92%到98%是比较容易的,而再从98%到99%是要费不少功夫的,一篇文章难以承载这么多内容,所以将会分成两篇文章,首先是从92%到98%,下一次是从98%到99%。

    不要小看提升1%,越往后面,难度就越大。如果我们做到99%准确率,在Kaggle的手写识别这个项目上,也就进入了前25%了,可以说入门了。

    一、回顾上期

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

    Hello World

    二、如何进行改进

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

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

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

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

    1 什么是卷积神经网络?

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

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

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

    一张图片

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

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

    2 什么是卷积层?

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

    3 什么是池化层?

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

    4 什么是全连接层?

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

    5 Dropout是什么?

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

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

    CNN卷积神经网络是什么?

    三、 代码实现

    1 标签的处理 2 把数据分为训练集和验证集 3 定义处理数据的函数 4 定义网络的结构 5 定义各类参数 6 进行训练

    四、生成结果

    这里迭代20个周期:

    7 验证集上的准确度

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

    8 生成结果

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

    祝大家好运~~~~

    附带之前的三篇文章:

    五分钟带你入门TensorFlow

    零基础用TensorFlow玩转Kaggle的“手写识别”

    这里剧透一下,下一篇文章将会使用Keras对模型进行重构和优化,使得模型准确率达到99%以上,在Kaggle进入前20%

    想第一时间看到下一篇优化模型的文章?抓紧,喜欢和关注吧~~~

    相关文章

      网友评论

      • 半尺尘:好文,希望能加一些保存模型成pb文件和使用pb文件做预测的知识~
      • HBU_DAVID:照着图片敲了一遍代码,学到了不少知识,非常感谢。
        开始在Spyder写的代码,第二次使用saver.restore(sess, "model.ckpt-19")会报错,换到Pycharm就不存在这个问题了。。。
        作为一个初学者,好多地方容易敲错,共享一份手敲代码供参考:
        https://github.com/HBU/PythonLearning/blob/master/TFtest/train.py
        =============
        再次感谢作者!
        00f4fb5a1fa0:层主你这样会让很多人偷懒的。:relieved:
        西瓜量化:@HBU_DAVID 同样感谢你的支持和完善:smile:
      • 65f3795b707e:我按着上面敲下来,出了一个错误
        File "D:\Anaconda3\envs\tensorflow\lib\site-packages\pandas\core\indexing.py", line 1269, in _convert_to_indexer
        .format(mask=objarr[mask]))

        KeyError: '[0] not in index'
        不清楚是什么问题导致的
        a3da2251f35e:labels_flat = train.iloc[:, 0].values.ravel()可以用
        a3da2251f35e:同样遇到labels_flat = train[[0]].values.ravel()有问题,但是没找到办法
      • d24232650e27:经过卷积和池化之后的logits_size=[1600,10] labels_size=[400,10] 的大小是不是不匹配了?
      • 784cb29111f1:卷积filter大小那里是不是书写错误?原图28x28,filter大小应该是5x5的吧,这样才能从32X32大小的窗口得到28x28的结果。
        西瓜量化:@lucien1062 除了步长,还取决于填充模式
        784cb29111f1:@一虎笔记 对,32那个是我理解错了,不知道channel的具体含义,另外卷积后大小不变不仅是因为步长为1+填充,是不是tensorflow里面默认都会对原始输入进行填充,所以卷积后大小是否变化就只取决于步长?
        西瓜量化:图片是28*28,因为步长为1,所以卷积后大小是不变的。PS:32不是窗口的大小,是channels的大小。

      本文标题:4用TensorFlow做Kaggle“手写识别”达到98%准确

      本文链接:https://www.haomeiwen.com/subject/krmiextx.html