互相关运算

  • 卷积层所表达的运算其实是互相关运算 (cross-correlation)
  • 在卷积层中,输入张量和核张量通过互相关运算产生输出张量。
例子:
  • 输入是高度为 3 、宽度为 3 的二维张量(即形状为 3×3 )

  • 卷积核的高度和宽度都是 2,而卷积核窗口(或卷积窗口)的形状由内核的高度和宽度决定(即 2×2 )

注意:
  • 输出大小略小于输入大小。

    • 这是因为卷积核的宽度和高度大于1, 而卷积核只与图像中每个大小完全适合的位置进行互相关运算。
    • 输出大小等于输入大小\(n_h×n_w\)减去卷积核大小\(k_h×k_w\),即\((n_h-k_h+1)×(n_w-k_w+1)\)
  • 需要足够的空间在图像上“移动”卷积核。

代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
import torch
from torch import nn
from d2l import torch as d2l


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

卷积层

  • 卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。
  • 卷积层中的两个被训练的参数是卷积核权重标量偏置
  • 在训练基于卷积层的模型时,我们也随机初始化卷积核权重。
代码实现
1
2
3
4
5
6
7
8
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卷积层。

卷积层中的填充和步幅

  • 这两个参数是超参数

  • 填充通常会使得输入和输出高宽一致

  • 通常步幅等于1,不选为1是因为计算量太大了,选2可以减半