前面我们用简单的方法来训练我们的模型,且w和b我们都是置零操作。对于这种简单的图片识别可能还有效果,稍微复杂一点的图片只怕这个网络就不行了。现在在图像识别领域最火的就是CNN算法了。我这里只放一张结构图,不过你先需要了解神经网络,我推荐这篇博文,写的真的非常棒。CNN推荐这篇,不过是全英文,理解起来可能费劲。
我们不去研究它的前世今生了(不过真的是非常有意思),我们学习该怎么理解并使用它。
手写字只是灰度图,而更多的现在是RGB图片,这些图片每张在计算机上就是一个有宽width, 高height, 深depth 来描述的 。它就是一个三维张量,然后展开成一个向量作为我们的输入层。其次卷积神经网络满足了画面不变性这个必要条件。怎么做到的呢?让权重在不同位置共享。
还要说说神经元怎么理解,你可以把它当作一个计算存储单元,上一层传来的数据经过计算存储后传给下一层。看看这张图,在网上流传甚广,它干了什么呢?也就是像素的加权求和,作用就是特征提取。黄色的3x3矩阵叫做卷积核,普通的卷积操作,卷积核是已知的,而卷积神经网络中卷积核是未知的。它需要我们训练的时候得出。这就是卷积层的工作。
注意上面的可以看作是depth为1的卷积,多维你可以想想一下,应该很好理解。
经过线性组合和偏移后,我们加入非线性来增强模型的拟合能力,最常用的就是ReLU激活函数,也叫修正线性单元,它是一个分段函数,0以上为线性函数,0以下为0。这层叫做激励层,也叫做非线性转化层。它的位置很灵活,而且可能不止一次被使用。
卷积之后还有一个pooling的操作,不知谁翻的池化层,很直白但是具体工作说起来就是采样。不如叫采样层?这个很类似于高斯去噪,局部范围取最大,也有取平均的,一般都是取最大。这样做的好处就是去掉一些冗余信息,当然可能其他像素点是否对识别有没有影响?我们不知道,这就可能出错。不过总的来说这是一个比较好的方法了。
上面的步骤总的来说是提取特征,然后特征我们该如何处理呢?我们是不是该给图片分类了,全连接层就是用来将最后的输出映射到线性可分的空间。通常送入全连接层进行分类的是平摊的向量,然后配合其进行分类。
当然输出层就是全连接层的分类结果。
还有几个概念:
超参数:就是学习之前自定义的量,比如学习率(梯度下降的步长),隐藏层数等。
正则化:降低模型复杂度以减少过拟合。
反向传播:梯度下降法的变形。
dropout: 防止过拟合,具体请看这篇博文
说了很多,还是要用实例来说明,网上很多,然后我看到一位仁兄写的挺细的,贴在这里。他是训练自己的图片,准确率不高,说更新也没后文了。。
我建议去看这个博文,每一步写的很清楚,学习后大概就懂了基本流程。
然后,后续我会去学习fast-RCNN还有faster-RCNN,用于目标检测,学习后继续分享心得。我放了很多链接是因为他们写的很好,我的理解不一定比他们好,学习的过程总是要博采众长。
祝学习愉快!
详细代码请访问:
https://github.com/chenzhibin29/MNIST