5.1 二维卷积层 卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度,常用来处理图像数据。本节中,我们将介绍简单形式的二维卷积层的工作原理。 5.1.1 二维互相关算算 虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cross-correlation)运算。在二维卷积层中,一个二维输入数组和一个二维核(kernel)数组通过互相关运算输出一个二维数组。 我们用一个具体例子来解释二维互相关运算的含义。如图5.1所示,输入是一个高和宽均为3的二维数组。我们将该数组的形状记为3×3 或(3,3)。核数组的高和宽分别为2。该数组在卷积计算中又称卷积核或过滤器(filter)。卷积核窗口(又称卷积窗口)的形状取决于卷积核的高和宽,即2×2 。图5.1中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+1×1+3×2+4×3=19 。 图5.1 二维互相关运算 在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。图5.1中的输出数组高和宽分别为2,其中的4个元素由二维互相关运算得出: 0×0+1×1+3×2+4×3=19,1×0+2×1+4×2+5×3=25,3×0+4×1+6×2+7×3=37,4×0+5×1+7×2+8×3=43. 下面我们将上述过程实现在corr2d函数里。它接受输入数组X与核数组K,并输出数组Y。 import torch from torch import nn print(torch.__version__) 1.5.0 def corr2d(X, K): # 本函数已保存在d2lzh_pytorch包中方便以后使用 h, w = K.shape X, K = X.float(), K.float() 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 我们可以构造图5.1中的输入数组X、核数组K来验证二维互相关运算的输出。 X = torch.tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) K = torch.tensor([[0, 1], [2, 3]]) corr2d(X, K) tensor([[19., 25.], [37., 43.]]) 5.1.2 二维卷积层 二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。卷积层的模型参数包括了卷积核和标量偏差。在训练模型的时候,通常我们先对卷积核随机初始化,然后不断迭代卷积核和偏差。 下面基于corr2d函数来实现一个自定义的二维卷积层。在构造函数__init__里我们声明weight和bias这两个模型参数。前向计算函数forward则是直接调用corr2d函数再加上偏差。 class Conv2D(nn.Module): def __init__(self, kernel_size): super(Conv2D, self).__init__() self.weight = nn.Parameter(torch.randn(kernel_size)) self.bias = nn.Parameter(torch.randn(1)) def forward(self, x): return corr2d(x, self.weight) + self.bias 卷积窗口形状为𝑝×𝑞 的卷积层称为𝑝×𝑞 卷积层。同样,𝑝×𝑞 卷积或𝑝×𝑞 卷积核说明卷积核的高和宽分别为𝑝 和𝑞 。 5.1.3 图像中物体边缘检测 下面我们来看一个卷积层的简单应用:检测图像中物体的边缘,即找到像素变化的位置。首先我们构造一张6×8 的图像(即高和宽分别为6像素和8像素的图像)。它中间4列为黑(0),其余为白(1)。 X = torch.ones(6
时间: 2025-07-16 11:11:36 浏览: 2
<think>好的,我现在要帮助用户理解二维卷积层的工作原理及其在深度学习中的应用,还有如何实现它。首先,我需要回忆一下二维卷积的基本概念和相关运算。用户提到了互相关运算,这可能和卷积操作有关,但有时候在深度学习里,实际上用的是互相关而不是严格的数学卷积,因为两者差别主要在于核是否翻转。
用户提供的引用内容中有MXNet的代码示例,里面定义了一个coor2d函数,看起来是计算二维互相关的。代码里通过嵌套循环遍历输出矩阵的每个位置,然后计算输入窗口和核的逐元素乘积之和。这应该就是互相关运算的基本步骤了。不过我需要确认互相关和卷积的区别,避免混淆。
接下来,我需要解释互相关运算的过程。输入是一个二维数组,比如图像,核也是一个二维数组。互相关运算就是滑动这个核窗口,在每个位置做元素乘积累加,得到输出特征图。这个过程可以提取局部特征,比如边缘、纹理等,对于图像处理非常重要。
然后,用户可能想知道如何从互相关运算过渡到深度学习中的卷积层。在卷积层中,核是可学习的参数,通过反向传播优化。每个卷积层可能有多个核,生成多个特征图。此外,还需要考虑步长、填充等超参数的影响。这些参数如何影响输出的大小?比如,输出尺寸的公式应该是(输入高-核高+1 + 2*填充)/步长 +1?但具体要看框架的实现方式,可能用户需要知道这些计算。
用户还提到实现细节,可能需要用代码示例来说明。虽然用户已经有一个MXNet的例子,但或许可以补充PyTorch或TensorFlow的实现,或者解释如何在框架中构建卷积层。例如,在PyTorch中,可以使用nn.Conv2d来定义卷积层,设置输入输出通道、核大小等参数。
另外,互相关运算在深度学习中的应用,比如在CNN中的卷积层、池化层,或者在图像分类、目标检测中的具体应用案例。可能需要提到一些经典网络结构,比如LeNet、AlexNet等,说明卷积层如何帮助提取层次化特征。
在实现部分,除了手动实现的互相关运算,还要指出实际中通常使用优化过的库函数,如cuDNN中的高效实现,以加速训练。同时,可能涉及到参数共享、稀疏连接等概念,这些都是卷积层的优势所在。
可能还需要解释通道的概念,比如输入是多通道的(如RGB图像),核也会相应有多个通道,每个通道的核与输入对应通道做互相关,然后求和得到一个输出通道。如果有多个核,每个核生成一个输出通道。因此,卷积层的参数数量与输入通道数、输出通道数、核大小有关。
最后,用户的问题还涉及理解这些概念,因此需要以清晰的结构分步骤解释,从互相关运算到卷积层的组成,再到应用和实现细节。同时,确保使用正确的LaTeX格式,比如数学公式用$...$或$$...$$,代码块用适当的标记,以及生成相关的问题。
现在,我需要检查是否有遗漏的部分,比如激活函数的作用,通常在卷积层后会跟一个激活函数如ReLU,增加非线性。或者批归一化层的作用。不过用户的问题主要集中在卷积层本身,可能不需要深入这些扩展内容,但简要提及可能有帮助。
总结,我的回答结构应该是:首先解释互相关运算,然后过渡到深度学习中的卷积层,讨论参数和超参数,实现细节,应用场景,最后给出代码示例和相关问题。同时,确保引用用户提供的参考文献,并正确标注引用标识。</think>### 二维卷积层的工作原理与实现
#### 1. 二维互相关运算
二维互相关运算(Cross-Correlation)是卷积层的基础操作。给定输入矩阵$X$和核矩阵$K$,输出矩阵$Y$的每个元素通过滑动窗口计算局部区域与核的逐元素乘积之和:
$$Y[i,j] = \sum_{a=0}^{h-1} \sum_{b=0}^{w-1} X[i+a,j+b] \cdot K[a,b]$$
其中$h$和$w$是核的高度和宽度。**注意**:深度学习中的“卷积”通常指互相关运算,与数学定义的卷积(需要翻转核)不同[^1]。
示例代码实现(基于MXNet):
```python
def coor2d(x, k):
h, w = k.shape
y = nd.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
```
#### 2. 卷积层的核心要素
| 组件 | 作用说明 |
|--------------|-------------------------------------------------------------------------|
| 可学习核参数 | 通过反向传播自动优化,每个核对应一种特征提取模式 |
| 多通道支持 | 输入为多通道时(如RGB图像),核维度扩展为$C_{in} \times h \times w$ |
| 输出特征图 | 每个核生成一个输出通道,最终输出维度为$C_{out} \times H' \times W'$ |
#### 3. 关键参数与计算
- **输出尺寸公式**:若输入尺寸为$H \times W$,核尺寸为$h \times w$,则输出尺寸为:
$$H' = \lfloor \frac{H - h + 2p}{s} \rfloor + 1$$
$$W' = \lfloor \frac{W - w + 2p}{s} \rfloor + 1$$
其中$p$为填充(padding),$s$为步长(stride)
- **参数量计算**:对于$C_{in}$输入通道和$C_{out}$输出通道:
$$\text{参数量} = C_{out} \times (C_{in} \times h \times w) + C_{out} \ (\text{bias})$$
#### 4. 实际框架实现(PyTorch示例)
```python
import torch.nn as nn
# 定义卷积层:输入通道3,输出通道64,核大小3x3,步长1,填充1
conv_layer = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1)
# 前向传播
input_tensor = torch.randn(1, 3, 224, 224) # (batch, channel, height, width)
output = conv_layer(input_tensor)
```
#### 5. 应用场景
1. **图像特征提取**:通过堆叠卷积层,可逐步提取边缘→纹理→物体部件等层次化特征
2. **参数共享**:同一核在整个输入上滑动,显著减少参数量(相比全连接层)
3. **经典网络结构**:LeNet-5的手写数字识别、ResNet的图像分类、U-Net的医学图像分割等
阅读全文
相关推荐

















