全连接层->卷积层
- 用有一个隐藏层的MLP训练ImageNet数据集(300*300的图像,有1000个类别),要有10000个输出
会有10亿个可学习的参数,量太大
全连接:一个输出是根据所有输入加权得到 - 在图片中识别物体:
- translation invariance(变换不变性):无论这个物体在哪,模型都会有相近的输出
- 本地性:像素点与周围的像素点联系更紧密
卷积层
- 本地性:一个输出只从k*k个输入的窗口中计算
- 变换不变性:不同的输出是使用相同的k*k的权重
由此一个卷积层模型的参数不再依赖于输入/输出的大小,只与窗口大小相关
一个核可以学习识别一个模式
单通道的输入和输出的卷积
# X是输入,K是权重,都是矩阵
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()
池化层(汇聚层)
- 卷积神经网络对位置很敏感,输入的一个像素的变化会导致输出的一个像素的变化
- 池化层会在k*k的窗口中计算元素的均值(均值汇聚)/最大值(最大汇聚)
# h,w是池化窗口的高和宽
# 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()
卷积神经网络
- 一个用卷积层的堆提取特征的神经网络
激活函数用在每个卷积层后
使用池化来减少位置敏感度 - 现代化的CNN是有各类超参数和层连接(AlexNet,VGG等)的深度神经网络