多输入通道
1. 每个通道都有一个卷积核,结果是所有通道卷积结果的和
2. 输入
核
输出
(1 × 1 + 2 × 2 + 4 × 3 + 5 × 4) + (0 × 0 + 1 × 1 + 3 × 2 + 4 × 3) = 56
多输出通道
1. 每个多输入通道进行完卷积运算,计算结果为一个单输出通道
1. 多个三维卷积核,每个核生成一个输出通道
2.输入
核
输出
多输入和输出通道
多输出通道:识别特定模式(特征提取)
多输入通道:识别特定模式并组合(权重使得我们可以人为对各种模式所起作用的大小进行自定义)
1*1卷积层
1
×
1卷积,即。因为使用了最小窗口,1
× 1卷积失去了卷积层的特有能力——在高度和宽度维度上,识别相邻元素间相互作用的能力。其实1
× 1卷积的唯⼀计算发⽣在通道上。相当于输入为
,权重为
的全连接层。
二维卷积层
输入
核
偏差
输出
总结
1. 输出通道数是卷积层的超参数
2. 每个输出通道有独立的二维卷积核,所有通道结果相加得到一个输出通道结果
3. 每个输出通道有独立的三维卷积核
代码
多输入通道互相关运算
import torch
from d2l import torch as d2l
#X 输入 K卷积核
def corr2d_multi_in(X,K):
return sum(d2l.corr2d(x,k) for x,k in zip(X,K))
#Ci=2
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)
多输出通道互相关运算
def corr2d_multi_in_out(X,K):
return torch.stack([corr2d_multi_in(X,k) for k in K],0)
# 输出通道1:K
# 输出通道2: K+1
# 输出通道3: K+2
# Co=3
K = torch.stack((K, K+1, K+2),0)
corr2d_multi_in_out(X,K)
1*1卷积
def corr2d_multi_in_out_1x1(X,K):
c_i, h, w = X.shape
c_o = K.shape[0]
X = X.reshape((c_i, h*w))
K = K.reshape((c_o, c_i))
Y = torch.matmul(K,X) # Y=(c_o, h*w)
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)
# 可以认为Y1==Y2
assert float(torch.abs(Y1-Y2).sum())<1e-6