卷积神经网络基础

还是学习 Victor Zhou 大佬. 博客 CNNs, Part 1: An Introduction to Convolutional Neural Networks

卷积神经网络(CNNs)是cv里的东西,,,

考虑一张图, 它不仅很大, 而且有RBG三个数据, 所以如果用最基本的神经网络的话, 一张图的输入层有 $3nm$ 个神经元, 这样隐藏层也很多, 导致训练困难.

从视觉角度来说, 单独的像素点意义不如它和它周围的某些点的整体明显. CNNs大概就是考虑相邻像素点.

过滤器是一个二维方阵, 用类似滑动窗口的思想去对应输入图片的某些部分. 把它们压成一个向量, 然后做点积, 结果放在对应部分, 这样就得到了处理后的图像.

就类似这样, 看看就能懂:

Step 1: Overlay the filter (right) on top of the image (left)
Step 1: Overlay the filter (right) on top of the image (left)
过程
过程

过滤器不同取值能够提取图片的不同特征, 原博客用计算机学家都喜欢的一个妹子的图片做了举例, 这里就不搬了(懒)

就这样:

A 4x4 input convolved with a 3x3 filter to produce a 4x4 output using same padding
A 4x4 input convolved with a 3x3 filter to produce a 4x4 output using same padding

处理后的图和原图大小一样.

如果不填充, 那么处理后的图片大小就是 $(n-2) \times (m-2)$.

过滤器可以设置多个, 能够提取不同的特征. 这些过滤器就在卷积层上.

$-2$还是太大了. 把图片稍微缩小一点, 人眼看起来该有的特征还是有的. 那么神经网络看起来该有的特征也应该有. 池化就是干了这么个操作.

Max Pooling (pool size 2) on a 4x4 image to produce a 2x2 output
Max Pooling (pool size 2) on a 4x4 image to produce a 2x2 output

上图取值用了max, 实际上可以用max, min, avg, 或者其他函数.

输出层的激活函数用Softmax. 他输出的是这个张图片中可能是某些物品的可能性.

比如识别 $0 \sim 9$ 的手写数字, 那么就有10个输出, 其中第$i$个输出代表该图片是数字$i$的可能性.

显然最后我们应该选可能性最大的那个当作我们识别出的数字.

大概长这样:

https://victorzhou.com/media/cnn-post/cnn-dims-3.svg

在CNNs中用**交叉熵损失(Cross-Entropy Loss)**来评价模型, 而不是均方误差.

Softmax输出的是可能性, 我们只考虑可能性最大的那个输出. 如果输出很接近1, 那么这样的模型是较为准确的. 所以, 可以用交叉熵来确定损失函数:

$$L(p_c) = -\ln(p_c)$$

其中, $p_c$ 是该图像属于分类$c$的可能性.

当然我们还是让$L$越小越好. $L = 0$就表示了$p_c = 1$. 训练还是一样, 最小化$L$.

就没了, 也不是很难.