#李宏毅《机器学习》|2021笔记:9.卷积神经网络
<--------感谢评论、答疑、指正!--------->
2021.10.5
LeeML-Notes:P21
2021.10.19 更新
LeeML2021:
① 2.3 输出层:Classification(P7)
② CNN(P21)
2023.01.30 更新
1. Full connected Network vs CNN
1.1 图片分类的基本思想
将一个解析度为100*100的图片输入模型,然后生成一个向量,再拿向量和不同的类别向量计算交叉熵。类别用one-hot vector表示,只有一维是 1,向量有多少维就能表示多少种类别。
1.2 神经网络处理出现的问题
- 处理影像可以用深度全连接模型
- 图片看成三维Tensor(宽,高,颜色RGB)
- 100*100是像素点数量,每个像素点都由RGB三种颜色构成,所以就有 3 个channels
- 向量中每维储存的数值代表某一个像素点的某一个颜色的强度!这个长向量作为自变量输入神经网络中。
输入层: 将一张图片的像素拉成一列做输入层
向量中总共有100x100x3 个自变量,假如采用全连接网络,隐藏层有1000个神经元,那么我们需要的参数就是30000000!!!!
【问题】: 方面参数太多了影响运算,另一方面模型弹性太大,很容易导致overfitting
1.3 网络简化思路和CNN解决方案
① 只需要辨识一些关键图案,而并非整张图案
所以隐藏层的神经元不需要看整个图片,每次只需一小部分作为输入,看看是否含有pattern。
【CNN解决方案】一个神经元不用连接所有的输入向量,只连接一部分的自变量。CNN中,这个小部分自变量就称为receptive field(感受域)。
*https://zhuanlan.zhihu.com/p/265831734 *
② 相同的 pattern 会出现在不同区域,不同感受域可以共用同一个鸟嘴检测器!!
【CNN解决方案】CNN中,相对相同位置用相同的参数 w,也就是同一个Filter。
③ image大小对识别没有影响
【CNN解决方案】CNN中,用了池化层,保留区域内特征。
2 CNN框架
2.1 卷积(Convolution)
*李宏毅老师这里讲的有问题,老师内容结合:https://zhuanlan.zhihu.com/p/268179286
2.1.1 单通道卷积
- 单通道就是如下图1张imag矩阵
- 单通道就是要么粗细,要么黑白 这种
- 卷积计算就是图像矩阵和Fliter对应位置做内积。(矩阵对应位置相乘再求和)
我们能看见的是单通道6 * 6 image 和两个卷积(Filter 1,2),计算过程如下:
【单通道矩阵与Fliter1内积】
① 做第一个位置与Filter 1矩阵的内积: 1 ∗ 1 + 1 ∗ 1 + 1 ∗ 1 = 3 1*1+1*1+1*1=3 1∗1+1∗1+1∗1=3
② 如果活动距离stride=1,那么就滑动一格继续做与Filter 1矩阵内积;如果stride=2,那么就滑动两格做内积,下面以stride=1为例: 1 ∗ 1 + 1 ∗ ( − 1 ) + 1 ∗ ( − 1 ) = − 1 1*1+1*(-1)+1*(-1)=-1 1∗1+1∗(−1)+1∗(−1)=−1
③ 现在使用stride=1进行操作,前面三行覆盖完成后可以得到:
④ 然后往下一行,继续进行内积
⑤ 直到图像矩阵和Filter 1矩阵内积结束,
得到
也就是 ,一张 1 ∗ 6 ∗ 6 1*6*6 1∗6∗6的图,经过一个 3 ∗ 3 3*3 3∗3的Fliter 1,得到了一个 1 ∗ 4 ∗ 4 1*4*4 1∗4∗4的矩阵,这个过程叫做卷积。
-
输出的 1 ∗ 4 ∗ 4 1*4*4 1∗4∗4叫做 Feature Map
-
Filter1要提取的特征就是↘方向都为1的特征
- 从图像上看,有两个地方满足这个条件(蓝色斜线部分),在4×4的矩阵里面就是3,这里的原理对于上一小节的第二个原因(同一个神经元可以在不同地方检测出特征,不用不同的Filter来干这个事情)。
【同样方法,做矩阵Filter 2,3,…n的内积】
提取的是是图像中竖直方向图像特征
一张 1 ∗ 6 ∗ 6 1*6*6 1∗6∗6的图,经过n个 3 ∗ 3 3*3 3∗3的卷积核,得到了一个 n ∗ 4 ∗ 4 n*4*4 n∗4∗4的矩阵,也就是n个4 * 4的矩阵
2.1.2 多通道卷积
我们常见的是,RGB三原色的三通道照片
- 【多通道单卷积核】
- 我们看红色的:如上图发现:每个卷积核有三层kernel,每个kernel可以不一样
- 右边为卷积后的特征图(feature map),左边为一个三通道的卷积核对输入图片左上放进行卷积时的示意图。因此,对于这个部分的计算过程有:
三层计算结果对应位置求和
多通道单卷积核最后生成的是个1维的 feature map
- 【多通道多卷积核】
左边依旧为输入矩阵,我们现在要用右边所示的两个卷积核对其进行卷积处理:
- 计算过程就是同样方法计算两个【多通道单卷积核】,如例,第一个核计算过程已经给出,数据一模一样。
- 我们可以观察出,图像及通道,卷积核就有几通道,卷积核的个数是输出的维数(矩阵的个数)
2.1.3 Convolution v.s. Fully Connected
-
CNN的convolution操作和Fully Connected神经网络有什么关系?
回答:convolution就是Fully Connected神经网络中的输入权重+隐藏层,且把其中的一些权重拿掉的结果;Feature Map相当于隐藏层的输出。【和网络简化1对应】
左边复现convolution操作,红框里面有9个pixels,这9个pixels在整张图像拉直后的编号是1、2、3、7、8、9、13、14、15,右上角是Filter1
- 操作数少了,每次只九个神经元参加了运算;
- 如下图,用了同一套(9个)权重,这样参数减少了【和网络简化2对应】
2.2 池化层(Pooling)
【和网络简化3对应】
最大池化:
- Max Pooling是池化层的一种处理方式之一,也就是取区域最大值,还有别的方式,比如求区域平均值等
- convolution操作之后得到如下的Feature Map,然后把4×4的Feature Map4个一组:
- 通过取区域最大数值、或区域平均等操作(看自己喜好)
也就是做完一套convolution+Max Pooling后,变成这样:
2.3 Flatten + Fully Connected Feedforward network
Flatten 就是把矩阵拉直,然后放到全连接层里。我们可见, Flatten是将所有层连到了一起
2.4 输出层:Classification
2.4.1 分类和回归输出的区别
- classification中,我们用 one-hot 向量表示不同的类别(一个向量中只有1 个 1 ,其余都为 0,1 在不同的位置代表不同类别)
- 在regression中的神经网络输出只有一个,而classification则有多个输出。
2.4.2 分类输出的处理
- 输出经过softmax后处理才去计算loss
- softmax,分子是用来将 y都变成正值!分母是用来归一化,保证输出 y′ 在0 与 1之间!
2.4.3 损失值计算方式不同
- 分类用交叉熵,回归用MSE
【区别】:用MSE计算分类问题,优化时容易卡住
3 实例:CNN in Keras
- 输入是:黑白二维的,像素是28*28的图片(1 * 28 * 28)
- 卷积层1:25张 3 * 3矩阵Filter ,那么输出是 25张 26 * 26的矩阵(25 * 26 * 26;默认滑动slide=1,所以才26 * 26)
- 最大池化层1:2*2的池化,所以输出 25 张13 * 13的矩阵(25 * 13 * 13)
- 卷积层2:可以看成输入的是25维的13 * 13矩阵;那么我们现在卷积核是50个,每个卷积核也是25维的,那么这层输出是50个11 * 11的矩阵;需要的参数3×3×25=225
- 2 * 2最大池化后 50 * 5 * 5 【有剩余,按理说11/2=5.5,一般的处理是,只取整数部分】
- flatten: 把输入展平 50x5x5=1250个输入到全连接层
- 两层全连接层 分别输出100维和10维 激活函数分别荣relu和softmax,最后输出10维。
4 CNN结构理解
4.1 convolution+Max Pooling部分
逼逼赖赖一大段,其实就是说每次convolution+Max Pooling去的是上一层的特征
- 第一个convolution+Max Pooling操作比较好理解,根据上篇笔记的内容可知,这里是用25个33的FIlter对输入的pixel进行特征的提取,得到Feature Map,而且这里如果把Filter的weight拿出来,是可以看出来要提取的特征是什么。
- 第二个convolution+Max Pooling操作的时候,输入的不再是pixel了,而是上一次操作得到结果,虽然Filter的大小还是33,但是它对于原输入的图像来说,覆盖的范围要大
- 我们矩阵内积的值,看成这个区域的在Filter下的激活程度;这个取区域最大值的操作,可以看成让Filter的激活程度最大地方。也就是和Fliter最像的地方
4.2 Flatten+Fully Connected NN部分
- 这里的每一个神经元对应的输入不再是图片的某一个小区域,而是整张图片。
- 输出就是个分类
5 应用场景
【电脑作图】
- 如果把照片丢到CNN训练后,把里面某一隐藏层或fully connected NN的某一层拿出来,然后把大数字变大,小的数字变小。就是让CNN把它看到东西夸大化:
- 左上角通过CNN训练得到Filter的output,这个FIlter的output就是图像的content;右上角通过CNN训练得到Filter的output,这个时候考虑的不算output的值,而是在意Filter与Filter之间的输出的correlation,这个correlation就是style。
CNN其他应用包括【围棋】、【语音】、【文本】等
参考文献
卷积:https://blog.csdn.net/wistonty11/article/details/116235432
卷积:https://zhuanlan.zhihu.com/p/268179286
笔记:https://blog.csdn.net/oldmao_2001/article/details/90751063
笔记:https://zhuanlan.zhihu.com/p/395982281
filter和kernal的区别:https://blog.csdn.net/weixin_35078004/article/details/112942164