3.6 卷积神经网络【stanford-cs329p】


Dense layer -> Convolution layer

  • 通过一个有10k维度的单隐藏层的MLP学习ImageNet(有1000个类别的300x300图像)

    • 导致了10亿的可学习参数,太大了
    • 全连接:一个输出是所有输入的加权求和
  • 图片中物体识别两个原则

    • 平移不变性:同样的输出不管这个物体在图片的哪个位置
    • 本地性:局部像素更和相近的像素相关,图片是连续的
  • 将先验信息在模型结构中构建

    • 实现更少的参数建模

Convolution layer

  • 本地性:全部丢入全连接肯定不行,图片里面像素局部识别就可以了,所以一个输出只从 $k\times k$ 的输入窗口计算

  • 平移不变性:目标在图片中平移应该也能用同一套参数计算出来,而不是重新学习,所以输出用同一个 $k\times k$ 的权重(kernel)

  • 这样模型的参数大小就不依赖于输入和输出的大小了

  • 一个核可以识别出一种模式

Code

  • 单通道的卷积
1
2
3
4
5
6
# both input `X` and weight `K` are matrices
h, w = K.shape
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
Y[i, j] = (X[i:i + h, j:j + w] * K).sum()

Pooling Layer

  • 卷积层对位置是敏感的

    • 一个输入像素的平移导致一个像素输出的平移,这当然是不好的,太敏感了鲁棒性就降低了,所以引入了池化层,这样对就对k个像素内的平移就不敏感了
  • 一个池化层计算 $k\times k$ 窗口的平均/最大

1
2
3
4
5
6
7
8
9
# h, w: pooling window height and weight
# mode: max or avg
Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
for i in range(Y.shape[0]):
for j in range(Y.shape[1]):
if mode == 'max':
Y[i, j] = X[i:i+h, j:j+w].max()
elif mode == 'avg':
Y[i, j] = X[i:i+h, j:j+w].mean()

Convolutional Neural Networks (CNN)

  • 一个神经网络用卷积层堆叠来抓取特征
    • 在每个卷积层后面使用激活函数
    • 使用池化层来降低位置敏感度
  • CNN模型是有很多超参数和层连接的深度神经网络