参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
假设我现在要识别一个图片,看他是猫还是狗(两分类),我用的是小米手机,像素是6400w。
我用一个单层的全连接神经网络来识别。
那我的输入就是一个()的向量,输出是一个one-hot的二维向量。
那我的参数就是。
一层肯定不可能识别出他是猫还是狗,那我给他多加一个隐藏层,隐藏层降到1000维。
那我现在的参数就是。
加了一个隐藏层,第一层参数就过亿了。为了识别一个图片大可不必。并且两层网络也不太可能识别出那是
猫还是狗。
所以随着网络加深,全连接层用到的参数量是无法估计的。
那怎么办呢?
这就用到了卷积层。
卷积层怎么用呢?就是我不整张图识别了。我分块识别。
卷积
全连接层直接计算整张图(左侧),卷积层就是是将图片分成小块块(右侧),从左到右从上到下慢慢扫描,每次只计算这一个小块块。
既然每次识别一个小块块了,那就要遵守两个规定:
- 局部性
- 平移不变性
平移不变性
看个公式:
先解释一下上边的公式:
-
为什么w是四维的:
回想一下单层神经网络输入为向量的时候:
那输入为矩阵的时候就是这样:
注意:我这里特意换了个乘号,因为这里执行的不是矩阵乘法,是矩阵元素按位相乘。并且讲道理不是这样的,但是我觉得这样说比较好接受为什么w变成四维了。
-
V 是 W 的重新索引
为什么要重新索引?
因为卷积核(黄块块,权重)大小是固定的,每次和x进行计算都是固定的方块大小,你也可以换个字母。也就是每次大小的x和大小的w进行运算。
但是因为位置是变化的,而x是,其中的k和l是一直变化的,每次计算的x位置都不同。而x是在整个大图里的,可以用整张图的i,j推算出每次x的位置是和,因此将k和l进行转化。整个式子变为
好了,现在再想一个问题,你x每次移动,但是我卷积核(黄块块)是平移不变的啊,不管你挪到哪里我都是固定大小,固定参数值,所以我为什么要有i和j? 花生,你发现了盲点。既然w和x的位置无关,那就完全可以扔掉在图中的相对位置啊。那就把i和j去掉就行了。然后整个式子变为
综上所述,就是所谓的平移不变性。
所以到这里,我们上边复杂的公式就变成了:
但是这个公式叫二维交叉。不是二维卷积。
那局部性呢?
上边那个公式本身就是符合局部性的。
因为w的大小是固定的。所以每次只和相同大小的x进行计算。只能计算黄框框覆盖的部分。
或者你可以把二维交叉转换成二维卷积:
当 时, 使得 :
就是说给一个区间,现在ab从开始计算,一直计算到,超出范围v就变0。保证了只在的大小内运算。
虽然两个公式可能看起来不一样,但是实际应用中都是一样的东西了,变为,换汤不换药。
我们也成功的获得了卷积公式。
当 时, 使得 :
用上边的公式进行卷积计算,假设我的图是8×6的图,现在用一个3×3的卷积核进行卷积。
根据公式,两个3×3的矩阵进行计算之后求和,将数字填入卷积层的第一个格子。之后向右移,向右移不动了向下移,直到最后。移完整个图。
经过一次卷积之后,获得的结果相比如输入少了两行两列。因为下边这两种情况x和w不重合是不用计算的,只需要计算能完全覆盖的区域即可。所以经过3×3的卷积核会少两行两列。如果是经过5×5的卷积核会少四行四列。
-
《动手学深度学习》系列更多可以看这里:《动手学深度学习》专栏(juejin.cn)
-
笔记Github地址:DeepLearningNotes/d2l(github.com)
还在更新中…………