卷积层

卷积

分类原则

  • 平移不变性:分类器对输入的平移不变性,即输入的图像平移后,分类器的输出不变。
  • 局部性:分类器关注输入的局部性

卷积层是一个特殊的全连接层

  1. 设计原理:
    平移不变性
    局部性
  2. 对全连接层进行变形:
    变形

代码实现

二维互相关和二维卷积的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import torch
from torch import nn
from d2l import torch as d2l

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

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

学习由X生成Y的卷积核:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
conv2d = nn.Conv2d(1, 1, kernel_size=(1, 2), bias=False)

X = X.reshape((1, 1, 6, 8))
Y = Y.reshape((1, 1, 6, 7))

for i in range(10):
Y_hat = conv2d(X)
l = (Y_hat - Y) ** 2
conv2d.zero_grad()
l.sum().backward()
conv2d.weight.data[:] -= 3e-2 * conv2d.weight.grad
if (i + 1) % 2 == 0:
print(f'epoch {i+1}, loss {l.sum():.3f}')

填充

在所有侧边填充1个像素

1
2
3
4
5
6
7
8
9
10
11
12
import torch 
from torch import nn

def comp_conv2d(conv2d,X);
X=X.reshape((1,1)+X.shape)#增加批量大小和通道数
Y=conv2d(X)
return Y.reshape(Y.shape[2:])

#padding代表上下左右填充的像素数
conv2d = nn.Conv2d(1,1,kernel_size=3,padding=1)
X = torch.rand(size=(8,8))
comp_conv2d(conv2d,X).shape

多输入输出

对于彩色图像这种信息,每个像素有RGB三个通道,每个通道都是一个二维矩阵,所以输入通道数为3。
输出通道数可以任意设置,一般为32、64、128等。

多输入通道

每个通道对应一个卷积核,结果是所有通道卷积结果的和
多输入通道

多输出通道

每个输出通道对应一个卷积核,结果是每个输出通道的卷积结果的和
多输出通道

多输入多输出

  • 每个通道可以识别特定模式
  • 利用1*1卷积核,没有单通道的广度,可以多通道的融合,相当于全连接层

代码实现

  1. 多输入通道互相关运算
1
2
3
4
5
import torch
from d2l import torch as d2l

def corr2d_multi_in(X,K):
return sum(d2l.corr2d(x,k) for x,k in zip(X,K))
  1. 多输出通道互相关运算
1
2
def corr2d_multi_in_out(X,K):
return torch.stack([corr2d_multi_in(X,k) for k in K],0)

卷积层
http://example.com/2025/08/17/25_08_17卷积层/
作者
ZF ZHAO
发布于
2025年8月17日
许可协议