卷积神经网络 CNN

应用:图像识别

处理一张图片的时候我们首先要看这张图片具有哪些特征点,如果图片是人,那么特征可能就是眼睛鼻子

  • 特征 (feature) 应该是本类具有的,其他类不具有的;其次,我们也要和本类中其他特别的样本进行比较
  • 过滤器 Filter/ 补丁 Patch / 卷积核 Convolution Kernel
    • 找到图像的某些特征之后,我们找其周围的一块像素点出来,将此设置为一个 filter 或者 patch
      从原图之中取出来进行卷积运算
      cnn

卷积运算思路

  • 在原图 m×mm\times m 的像素矩阵中,我们有过滤器 n×nn\times n,则卷积就是从原矩阵中抽出 n×nn\times n 的尺寸的矩阵和过滤器做对应相乘相加求和就是结果了
  • 平移过滤器使其遍历原图即可获得特征谱 (feature map)
  • 由此我们也可以看出不同的 filter 矩阵对应的功能也不同
  • 事实上我们只需要指定卷积核的个数和尺寸就可以了,不需要具体指定卷积核的特征

卷积神经网络

维度变化

![[convolution_concept.png]]
如图,在相邻的全连接层,如果对前面

池化 pooling

分为最大池化以及平均池化,最大池化表示的是将选定区域的最大元素保留其余元素删除得到的剩余矩阵,相当于是一个采样的过程
平均池化则是对选定区域的值计算平均值然后进行保留,也是采样的过程
池化和卷积一样都会用到 stride 变量来进行快速处理
在卷积层后面进行处理,可以将卷积层提取出来的特征进行保留

边缘丢失问题:图像边缘特征由于图像处理时被降维处理,会出现特征丢失现象

  • 只需要提前扩充图片的边缘使之拥有无色(或者白色)的外边缘
  • 最大池化 Max Pooling
    • 处理的时候不重复做,例如 6×66\times 6 的网格分成 9 个 2×22\times 2 的网格,各自生成一个特征方块
    • 直接提取里面的最大值进行处理
    • 这样就保留了 “最精华” 的部分
    • 也叫 “汇集”

扁平化处理

  • 将过滤之后(也叫池化)的物体进行高维转一维,形成一维数据条
  • 将一维数据条连接到后面的全连接隐藏层,产生输出结果(也就是直接走 ANN)
  • 全连接保证了输出结果关联整张图片

跨步 Strides

  • 通过步长控制减少重复的次数,提高扫描效率
    stride,太小,重复计算较多,计算量大,训练效率降低;
    stride,太大,会造成信息遗漏,无法有效提炼数据背后的特征;

torch 实现

  • self.conv1 = nn.Conv2d(1, 32, 5) 通过 Conv2d() 函数实现
  • 1个输入,32个输出,5×55\times 5 的过滤器
  • 输出的尺寸:是一个4维度张量,满足 [batch_size,out_channel,pic_wid,pic_hei]
    • pic_wid 的计算公式是 (input_width)(filter_width)+2×paddingstride+1\frac{(input\_width)-(filter\_width)+2\times padding}{stride} + 1
    • pic_hei 的算法同上
    • 在卷积层和全连接层之间应该有一个 展平 的操作