卷积神经网络:
1.不变性:
设计适合于计算机视觉的神经网络结构:
平移不变性:不管出现在图像中的哪个位置,神经网络的底层应该对相同的图像区域做出类似的响应。这个原理即为“平移不变性”。
局部性:神经网络的底层应该只探索输入图像中的局部区域,而不考虑图像远处区域的内容,这就是“局部性”原则。最终,这些局部特征可以融会贯通,在整个图像级别上做出预测。
平移不变性。 这意味着输入 X 中的移位,应该仅与隐藏表示 H 中的移位相关。
这就是 卷积 (convolution)
局部性。为了收集用来训练参数 [H]i,j 的相关信息,我们不应偏离到距 (i,j) 很远的地方。
这便是一个卷积层。卷积神经网络是包含卷积层的一类特殊的神经网络。V 被称为 卷积核 (convolution kernel) 或者 滤波器 (filter),是可学习的权重。
- 图像卷积
卷积所表达的运算其实是 互相关运算 (cross-correlation)
输出的卷积层有时被称为 特征映射 (Feature Map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。
在CNN中,对于某一层的任意元素 xx ,其 感受野 (Receptive Field)是指在前向传播期间可能影响 xx 计算的所有元素(来自所有先前层)。
二维互相关运算具体代码:
def corr2d(X, K): #@save
"""计算二维互相关运算。"""
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()
return Y
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。 所以,卷积层中的两个被训练的参数是卷积核权重和标量偏置。 就像我们之前随机初始化全连接层一样,在训练基于卷积层的模型时,我们也随机初始化卷积核权重。
class Conv2D(nn.Module):
def __init__(self, kernel_size):
super().__init__()
self.weight = nn.Parameter(torch.rand(kernel_size))
self.bias = nn.Parameter(torch.zeros(1))
def forward(self, x):
return corr2d(x, self.weight) + self.bias
- 填充和步幅
填充(padding)和 步幅 (stride)是会影响输出的大小的因素
在应用了连续的卷积之后,我们最终得到的输出远小于输入大小。这是由于卷积核的宽度和高度通常大于 11 所导致的。如此一来,原始图像的边界丢失了许多有用信息。 而填充 是解决此问题最有效的方法。
我们可能希望大幅降低图像的宽度和高度。例如,如果我们发现原始的输入分辨率十分冗余。 步幅则可以在这类情况下提供帮助。
如果我们添加 phph 行填充(大约一半在顶部,一半在底部)和 pwpw 列填充(左侧大约一半,右侧一半),则输出形状将为
在许多情况下,我们需要设置 ph=kh−1ph=kh−1 和 pw=kw−1pw=kw−1,使输入和输出具有相同的高度和宽度。
卷积神经网络中卷积核的高度和宽度通常为奇数,例如 1、3、5 或 7。 选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。
- 多输入与多输出通道
当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如,每个RGB输入图像具有 3×h×w3×h×w 的形状。我们将这个大小为 33 的轴称为 通道(channel) 维度。
多输入通道:
当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数目的卷积核,以便与输入数据进行互相关运算。
对每个通道执行互相关操作,然后将结果相加。
多输出通道:
在最流行的神经网络架构中,随着神经网络层数的加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。
可以将每个通道看作是对不同特征的响应。而现实可能更为复杂一些,因为每个通道不是独立学习的,而是为了共同使用而优化的。因此,多输出通道并不仅是学习多个单通道的检测器。