赞
踩
多个输入通道:每个通道都有一个卷积核,结果是所有通道卷积结果的和
输入 X \mathbf{X} X: c i × n h × n w c_i \times n_h \times n_w ci×nh×nw
核 W \mathbf{W} W: c i × k h × k w c_i \times k_h \times k_w ci×kh×kw
输出
Y
\mathbf{Y}
Y:
m
h
×
m
w
m_h \times m_w
mh×mw
Y
=
∑
i
=
0
c
i
X
i
,
:
,
:
∗
⋆
W
i
,
:
,
:
\mathbf{Y}=\sum_{i=0}^{c_{i}} \mathbf{X}_{i,:,:}^{*} \star \mathbf{W}_{i,:,:}
Y=i=0∑ciXi,:,:∗⋆Wi,:,:
多个输出通道:我们可以有多个三维卷积核,每个核生成一个输出通道
输入 X \mathbf{X} X: c i × n h × n w c_i \times n_h \times n_w ci×nh×nw
核 W \mathbf{W} W: c o × c i × k h × k w c_o \times c_i \times k_h \times k_w co×ci×kh×kw
输出
Y
\mathbf{Y}
Y:
c
o
×
m
h
×
m
w
c_o \times m_h \times m_w
co×mh×mw
Y
i
,
:
,
:
=
X
⋆
W
i
,
,
:
,
:
for
i
=
1
,
…
,
c
o
\mathbf{Y}_{i,:,:}=\mathbf{X} \star \mathbf{W}_{i,,:,:} \quad \text { for } i=1, \ldots, c_{o}
Yi,:,:=X⋆Wi,,:,: for i=1,…,co
计算复杂度(浮点计算数FLOP):
O
(
c
i
c
o
k
h
k
w
m
h
m
w
)
O(c_i c_o k_h k_w m_h m_w)
O(cicokhkwmhmw)
多个输入通道和输出通道
1 x 1
卷积层
k h = k w = 1 k_h = k_w = 1 kh=kw=1是一个受欢迎的选择。它不识别空间模式,只是融合通道。
相当于输入形状为 n h n w × c i n_h n_w \times c_i nhnw×ci,权重为 c o × c i c_o \times c_i co×ci的全连接层。
输出通道数是卷积层的超参数;每个输入通道有独立的二维卷积核,所有的通道结果相加得到一个输出通道结果;每个输出通道有独立的三维卷积核。
多输入通道互相关运算
import torch 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 def corr2d_multi_in(X, K): # X[c_i, n_h, n_w], K[c_i, k_h, k_w] # for遍历的时候会对最外层的维度做遍历 return sum(corr2d(x, k) for x, k in zip(X, K))
多输入多输出通道互相关运算
import torch
def corr2d_multi_in_out(X, K):
# X[c_i, n_h, n_w], K[c_o, c_i, k_h, k_w]
return torch.stack([corr2d_multi_in(X, k) for k in K], 0)
1 x 1
卷积
import torch
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)
return Y.reshape((c_o, h, w))
假设输出的高宽没有变的话,通过不改变通道数; 假设将输出的高宽变为输入的1/2
,通道数通常设为输入的2
倍。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。