pytorch神经网络图像卷积运算 Python深度学习pytorch神经网络图像卷积运算详解
Supre_yuan 人气:0由于卷积神经网络的设计是用于探索图像数据,本节我们将以图像为例。
互相关运算
严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算(cross-correlation),而不是卷积运算。在卷积层中,输入张量和核张量通过互相关运算产生输出张量。
首先,我们暂时忽略通道(第三维)这一情况,看看如何处理二维图像数据和隐藏表示。下图中,输入是高度为3、宽度为3的二维张量(即形状为 3 × 3 3\times3 3×3)。卷积核的高度和宽度都是2。
注意,输出大小略小于输入大小。这是因为我们需要足够的空间在图像上“移动”卷积核。稍后,我们将看到如何通过在图像边界周围填充零来保证有足够的空间移动内核,从而保持输出大小不变。
def corr2d(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() return Y
卷积层
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。所以,卷积层中的两个被训练的参数是卷积核权重核标量偏置。就像我们之前随机初始化全连接层一样,在训练基于卷积层的模型时,我们也随机初始化卷积核权重。
基于上面定义的corr2d函数实现二维卷积层。在__init__构造函数中,将weight和bias声明为两个模型参数。前向传播函数调用corr2d函数并添加偏置。
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
高度和宽度分别为 h和 w的卷积核可以被称为 h × w 卷积或 h × w 卷积核。我们也将带有 h × w 卷积核的卷积层称为 h × w 卷积层。
特征映射
下图中输出的卷积层有时被称为特征映射(Feature Map),因为它可以被视为一个输入映射到下一层的空间维度的转换器。在CNN中,对于某一层的任意元素 x x x,其感受野(Receptive Field)是指在前向传播期间可能影响 x x x计算的所有元素(来自所有先前层)。
注意,感受野的覆盖率可能大于某层输入的实际区域大小。
例如上图:给定 2 × 2 卷积核,阴影输出元素值19的接收域是阴影部分的四个元素。假设之前输出为 Y ,其大小为 2 × 2 ,现在我们再其后附加一个卷积层,该卷积层以 Y 为输入,输出单个元素 z。再这种情况下, Y上的 z的接收字段包括 Y 的所有四个元素,而输入的感受野包括最初所有九个输入元素。
因此,当一个特征图中的任意元素需要检测更广区域的输入特征时,我们可以构建一个更深的网络。
加载全部内容