机器学习笔记:CNN卷积神经网络

推荐一个网站 CNN Explainer (poloclub.github.io),可以直观地理解CNN的具体过程

1,CNN概述

卷积神经网络由输入层、卷积层、池化层、全连接层和输出层组成。

通过增加卷积层和池化层,可以得到更深层次的网络。

与多层感知器相比,卷积神经网络的参数更少,不容易发生过拟合。

2, 为何CNN更适合图像问题

2.1 管中窥豹

看image的一小部分,就可以识别这个image了,不用看全

2.2 相同模式(等变性……不变性)

同样的pattern ,出现在image的不同地方,但是这些image表达的是同一个东西

2.2.1 不变性分类

  • 平移不变性:Translation Invariance
  • 旋转/视角不变性:Ratation/Viewpoint Invariance
  • 尺度不变性:Size Invariance
  • 光照不变性:Illumination Invariance

2.2.2 平移不变性

  • 图像中的目标不管被移动到图片的哪个位置,得到的结果(标签)应该是相同的
  • 卷积+最大池化约等于平移不变性

卷积是一种等变性(equivariant)

f(g(x))=g(f(x)) ,f是卷积,g是平移旋转啥的

图像经过平移,相应的特征图上的表达也是平移的。下图只是一个为了说明这个问题的例子。输入图像的左下角有一个人脸,经过卷积,人脸的特征(眼睛,鼻子)也位于特征图的左下角。

假如人脸特征在图像的左上角,那么卷积后对应的特征也在特征图的左上角。但是通过全连接层之后,识别出的特征是不变的

 

池化可以看成一种近似的不变性 

f(x)=f(g(x)),f是池化,g是平移啥的(但如果平移出了感受野,就不是不变性了,所以是近似) 

比如最大池化,它返回感受野中的最大值,如果最大值被移动了,但是仍然在这个感受野中,那么池化层也仍然会输出相同的最大值。这就有点平移不变的意思了。 

2.3 降采样

进行降采样不会影响image的识别(就是说我行和列都等比例地取一部分)

2.4  CNN的解决之道

3 卷积

3.1 卷积层概述

在第一层卷积层对输入样本进行卷积操作后,就可以得到他的特征图(一个卷积层用同一卷积核对每个输入样本进行卷积操作)【一般得到的特征图尺寸小于原图大小】

第二层及之后的卷积层把前一层的特征图作为输入数据,进行卷积操作。(每个位置对应元素乘积之和)

一个卷积层可能有多个卷积核,每个卷积核对应了一个特征图。

共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。

filter里面的值是可以被学出来的。某个位置,有几个filter,就会有几个matrix输出。

对上图,输入的channel为3,那么卷积层的每一个filter也有3个channel(这里我们filter的维数为3*3*3),每次卷积的时候channel中27个元素和filter中的27个元素做运算。

3.2 stride 步长

我们可以手动设置stride步长

stride=1的时候:

 n-k表示input中的k*k可以向右移动最多几个,再加上原始的1

3.3 卷积层和全连接神经网络之间的联系

卷积相当于一个连接稀疏的前馈神经网络(基于视野的稀疏,只有此时filter看到的元素可以参与前向传播)——减少参数量

每一个filter作用在每一个filter那么大的input矩阵上,权值是共享的——参数量更少了

3.4 理解in_channel和out_channel之间的联系

以下图的feature_map为例,输入是7*7的图像,其中每个位置不再是一个pixel,而是一个三维向量(即in_channel为3)

为了和in_channel对齐,所以我每一个CNN的filter需要有in_channel(3)个channel(在这里,每一个channel是一个3*3的卷积核 )

输入的这3*3*3个点和卷积核的3*3*3个点相乘,得到输出的一个点的值

输出有out_channel(2)个,每个out_channel需要有一个3*3*3的卷积核

所以一个有in_channel(类似于"行数")*out_channel(类似于"列数")个3*3的卷积核

也就是说,参数个数为in_channel*out_channel*kenel_height*kernel_width

3.4.1 CNN对于参数个数的增益

我们拿MLP做对比:

kernel size:K=3

input_channel:C_in=3

output_channel:C_oout=64

CNN需要的参数个数:K*K*C_in*C_out=1728 【如果算上bias的话,就是K*K*C_in*C_out+C_out]

对于一张32*32的图像,一个MLP需要 (32*32*3)*(32*32*64)=2,0132,6592个参数!

3.5 padding

使用padding,可以让输出和输入尺寸一样

3.5.1 zero-padding

3.5.2 mirror-padding 

3.5.3 duplicate padding

    用最近的值来填充

3.6 dilation 

dilation 的作用是在不增加参数量数量级的情况下,指数级地提升感受野

3.7 卷积层输出的大小

3.8 感受野 perceptive field

输出的一个1*1的格子,可以包含输入的k*k的信息

n-k+1=1——>n=k

与此同时,这一个1*1的格子,可以看到上上层(2k-1)*(2k-1)的信息

n-k+1=k——>n=2k-1

上上上层:

n-k+1=2k-1——>n=3k-2

3.8.1 感受野和分辨率

 在图像识别问题的神经网络中,很常见的操作是逐渐降低特征图的分辨率。(这个可以由后面的池化操作实现)

 3.9 一维卷积  

3.9.1 1*1 卷积

不学习任何空间信息,只是进行channel的整合

4 池化层

n合一操作

经过卷积层的filter之后的输出:

再经过max-pooling之后的结果:

有不同的池化方式,比较典型的有最大池化、平均池化

参数训练也是采用误差反向传播的方法。误差只会传给池化时选定的单元(类似于前面的卷积,filter没看到的部分是没有连接的,这些元素的信息是不会前向传播到后面的元素的;然后没有被池化层选定的单元连接权重为0,这些元素的信息也是不会前向传播到后面的元素的。所以只有被选中的元素的信息会传递,那么反向传播更新参数的时候也只会把误差传递给这几个元素)

4.1 池化操作的输出大小

和卷积操作一样

5 flatten+全连接

6 CNN各参数对结果和性能的影响

6.1 卷积核大小

卷积核大小——不会对识别性能有很大的影响

6.2 卷积核数量

卷积核越多,识别越好

6.3 激活函数

Relu和maxout好于sigmoid和tanh

6.4 其他因素的影响

7 CNN应用:deep dream

把CNN一个层上的参数绝对值变大

这样可以让原来的特征被识别得更加“夸张”。

8 CNN用于 NLP问题中

一般都是一维卷积(时间维度)

9 总结

经过一个卷积层之后,image的深度只取决于这个卷积层的filter数目,和之前卷积层中filter的数目无关

10 CNN进阶:减少卷积层参数量

卷积神经网络的参数量是个可以优化的点,尤其在网络层数很深的情况下,那么怎么减少卷积层的参数数量呢?

  • 使用堆叠小卷积核代替大卷积核:2个3×3的卷积核可以代替1个5×5的卷积核

  • 使用分离卷积操作:将原本K×K×C的卷积操作分离为K×K×1和1×1×C的两部分操作

  • 在卷积层前使用池化操作:池化可以降低卷积层的输入特征维度

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值