多输入通道
1.彩色图像可能有RGB三个通道
2.转换为灰色会丢失信息
3.每个通道都有一个卷积核,结果是所有通道卷积结果的和
多输出通道
1.无论有多少输入通道,可以有多个三维卷积核,每个核生成一个输出通道
多个输入和输出通道
1.每个输出通道可以识别特定模式
2.输入通道核识别并组合输入中的模式
1✖1卷积层
1.kh=kw=1,它不识别空间模式,只是融合通道,相当于输入形状是nhnw✖ci,权重co✖ci的全连接层。
总结
1.输出通道数是卷积层的超参数。
2.每个输入通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果。
3.每个输出通道有独立 的三维卷积核。
代码实现
多输入多输出通道
import torch
from d2l import torch as d2l
def corr2d_multi_in(X,K): # 互相关运算处理多个通道(X和K都是三维)
return sum(d2l.corr2d(x,k) for x,k in zip(X,K)) # for:每一次输入通道的小矩阵
验证互相关运算的输出
X=torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
K=torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])
corr2d_multi_in(X, K)
tensor([[ 56., 72.],
[104., 120.]])
计算多个通道的输出的互相关函数
def corr2d_multi_in_out(X,K):
return torch.stack([corr2d_multi_in(X,k) for k in K],0) # 从4D的K中拿出一个3D的k进行上一步的操作
K=torch.stack((K,K+1,K+2),0) # 在第0维把K,K+1,K+2堆叠成新的矩阵
K.shape # stack: 沿着一个新的维度串联一连串的张量
torch.Size([3, 2, 2, 2])
corr2d_multi_in_out(X, K) # 三个卷积核,每个卷积核有两个通道,每个通道是2✖2的矩阵
tensor([[[ 56., 72.],
[104., 120.]],
[[ 76., 100.],
[148., 172.]],
[[ 96., 128.],
[192., 224.]]])
1✖1的卷积
def corr2d_multi_in_out_1x1(X,K):
c_i,h,w = X.shape
c_o = K.shape[0] # K的第一个shape
X = X.reshape((c_i,h*w))
K = K.reshape((c_o,c_i))
Y=torch.matmul(K,X)
return Y.reshape((c_o,h,w))
# 验证
X=torch.normal(0,1,(3,3,3))
K=torch.normal(0,1,(2,3,1,1))
Y1=corr2d_multi_in_out_1x1(X,K)
Y2=corr2d_multi_in_out(X,K)
assert float(torch.abs(Y1-Y2).sum()) < 1e-6
# Y1=Y2: 是因为用了1✖1的kernel后,把单通道的输入变成向量计算得到的值Y1=直接当作矩阵计算得到的值Y2