《动手学深度学习 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 时,如何使用矩阵乘法实现卷积?

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

相关推荐
hey you~3 分钟前
2026年大模型语音机器人知识库导入与调优全指南:从切分到重排序的7个关键步骤
人工智能·机器人·语音识别·向量检索·rag·知识库导入·知识库调优
ch62311 分钟前
《AI 辅助编程实战:从零跑通一个 Excel 报表生成脚本的踩坑与复盘》
人工智能·python
云边云科技_云网融合12 分钟前
持续深化合作 | 云边云科技再次通过亚马逊云科技的能力认证
人工智能·科技
Joy T14 分钟前
Agent 上线前怎么评测:从完成标准、离线测试集到 Trace 回归
人工智能·trace·eval·回归测试
小天源19 分钟前
智叟云集系统架构解析:从品牌 AI 可见度监测到前后端协同
人工智能·react.js·系统架构·node.js·react·ai监测·ai品牌监测
Tangyuewei20 分钟前
Agent 别裸奔进生产:先搭架构、可观测、人审三道闸
人工智能·ai编程
睡后收入27 分钟前
PDF 转 draw.io:把设计文档里的架构图恢复成下一版源文件
人工智能
用户66026761187931 分钟前
换个对话就丢进度?给 AI Coding 留一张能核对的开发状态卡
人工智能
用户8231456152734 分钟前
AI 生成的代码,凭什么说它"可靠"?|5 个陷阱 + 一张自检清单
人工智能
Gu0Qiang36 分钟前
从 0 到 1 打造 AI 提示流编排器:别让 Agent 原地鬼打墙!连续 3 次相同工具调用的柔性引导与硬熔断(开源系列 19)
人工智能·github