《动手学深度学习 Pytorch版》 6.4 多输入多输出通道

python 复制代码
import torch
from d2l import torch as d2l

6.4.1 多输入通道

简言之,多通道即为单通道之推广,各参数对上即可。

python 复制代码
def corr2d_multi_in(X, K):
    # 先遍历"X"和"K"的第0个维度(通道维度),再把它们加在一起
    return sum(d2l.corr2d(x, k) for x, k in zip(X, K))

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.]])

6.4.2 多输出通道

python 复制代码
def corr2d_multi_in_out(X, K):
    # 迭代"K"的第0个维度,每次都对输入"X"执行互相关运算。
    # 最后将所有结果都叠加在一起
    return torch.stack([corr2d_multi_in(X, k) for k in K], 0)

K = torch.stack((K, K + 1, K + 2), 0)  # 构造一个具有三个输出通道的卷积核
K, K.shape
(tensor([[[[0., 1.],
           [2., 3.]],
 
          [[1., 2.],
           [3., 4.]]],

[[[1., 2.],

[3., 4.]],

          [[2., 3.],
           [4., 5.]]],

[[[2., 3.],

[4., 5.]],

          [[3., 4.],
           [5., 6.]]]]),
 torch.Size([3, 2, 2, 2]))
python 复制代码
corr2d_multi_in_out(X, K)
tensor([[[ 56.,  72.],
         [104., 120.]],

        [[ 76., 100.],
         [148., 172.]],

        [[ 96., 128.],
         [192., 224.]]])

6.4.3 1 × 1 1\times1 1×1卷积层

1 × 1 1\times1 1×1 的卷积失去了卷积层在高度和宽度维度上识别相邻元素间相互作用的能力。可以将其看作再每个像素位置的全连接层。

python 复制代码
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))  # 展开为 h*w 的张量方便计算
    K = K.reshape((c_o, c_i))  # 同样的展开
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)
    return Y.reshape((c_o, h, w))
python 复制代码
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  # 执行1*1卷积运算时上述函数相当于先前实现的互关函数

练习

(1)假设我们有两个卷积核,大小分别为 k 1 k_1 k1 和 k 2 k_2 k2 (中间没有非线性激活函数)。

a. 证明运算可以用单次卷积来表示。

b. 这个等效的单个卷积核的维数是多少呢?

c. 单次卷积是否可以用两个卷积来表示呢?

不会


(2)假设输入为 c i × h × w c_i\times h\times w ci×h×w,卷积核大小为 c o × c i × k h × k w c_o\times c_i\times k_h\times k_w co×ci×kh×kw,填充为 ( p h , p w ) (p_h,p_w) (ph,pw),步幅为 ( s h , s w ) (s_h,s_w) (sh,sw)。

a. 前向传播的计算成本(乘法和加法)是多少?
b. 内存占用空间是多大?
c. 反向传播的内存占用空间是多大?
d. 反向传播的计算成本是多少?

⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ \left\lfloor(n_h-k_h+p_h+s_h)/s_h\right\rfloor\times\left\lfloor(n_w-k_w+p_w+s_w)/s_w\right\rfloor ⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋

a. 前向传播的计算成本为:

( ⌊ ( h − k h + p h + s h ) / s h ⌋ × ⌊ ( w − k w + p w + s w ) / s w ⌋ ) × c o × c i × ( k h × k w + 1 ) (\left\lfloor(h-k_h+p_h+s_h)/s_h\right\rfloor\times\left\lfloor(w-k_w+p_w+s_w)/s_w\right\rfloor)\times c_o\times c_i\times(k_h\times k_w+1) (⌊(h−kh+ph+sh)/sh⌋×⌊(w−kw+pw+sw)/sw⌋)×co×ci×(kh×kw+1)

b. 占用空间为:

( ⌊ ( h − k h + p h + s h ) / s h ⌋ × ⌊ ( w − k w + p w + s w ) / s w ⌋ ) × c o × c i × 4 B (\left\lfloor(h-k_h+p_h+s_h)/s_h\right\rfloor\times\left\lfloor(w-k_w+p_w+s_w)/s_w\right\rfloor)\times c_o\times c_i\times4B (⌊(h−kh+ph+sh)/sh⌋×⌊(w−kw+pw+sw)/sw⌋)×co×ci×4B

c. 不会

d. 不会


(3)如果我们将输入通道 c i c_i ci 和输出通道 c o c_o co 的数量加倍,计算量会增加多少?如果我们把填充数翻一番会怎么样?

如上题,将输入通道 c i c_i ci 和输出通道 c o c_o co 的数量加倍则计算量会增加 4 倍。

填充数翻一倍还要考虑步长。


(4)如果卷积核的高度和宽度是 k h = k w = 1 k_h=k_w=1 kh=kw=1,前向传播的计算复杂的是多少?

c o × c i × h × w c_o\times c_i\times h\times w co×ci×h×w


(5)本节最后一个示例中的变量 Y1 和 Y2 是否完全相同?为什么?

浮点数有误差,肯定不可能完全相同。


(6)当卷积窗口不是 1 × 1 1\times1 1×1 时,如何使用矩阵乘法实现卷积?

?一直用的就是矩阵乘法哇

相关推荐
Elastic 中国社区官方博客1 小时前
使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变
大数据·人工智能·elasticsearch·microsoft·搜索引擎·ai·azure
江_小_白2 小时前
自动驾驶之激光雷达
人工智能·机器学习·自动驾驶
yusaisai大鱼3 小时前
TensorFlow如何调用GPU?
人工智能·tensorflow
珠海新立电子科技有限公司6 小时前
FPC柔性线路板与智能生活的融合
人工智能·生活·制造
IT古董6 小时前
【机器学习】机器学习中用到的高等数学知识-8. 图论 (Graph Theory)
人工智能·机器学习·图论
曼城周杰伦6 小时前
自然语言处理:第六十三章 阿里Qwen2 & 2.5系列
人工智能·阿里云·语言模型·自然语言处理·chatgpt·nlp·gpt-3
余炜yw7 小时前
【LSTM实战】跨越千年,赋诗成文:用LSTM重现唐诗的韵律与情感
人工智能·rnn·深度学习
莫叫石榴姐7 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
96777 小时前
对抗样本存在的原因
深度学习
如若1237 小时前
利用 `OpenCV` 和 `Matplotlib` 库进行图像读取、颜色空间转换、掩膜创建、颜色替换
人工智能·opencv·matplotlib