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

相关推荐
玖日大大几秒前
ModelEngine 可视化编排实战:从智能会议助手到企业级 AI 应用构建全指南
大数据·人工智能·算法
DashVector2 分钟前
通义 DeepResearch:开源 AI 智能体的新纪元
人工智能·阿里云·ai·语言模型
大千AI助手2 分钟前
Text-Embedding-Ada-002:技术原理、性能评估与应用实践综述
人工智能·机器学习·openai·embedding·ada-002·文本嵌入·大千ai助手
北京地铁1号线5 分钟前
知识图谱简介
人工智能·知识图谱
币圈菜头6 分钟前
视听测试版功能正式开放:符合条件的用户已可抢先体验
人工智能·web3·区块链
智算菩萨6 分钟前
GPT-5.2 最新官方报告(基于 OpenAI 官网/官方文档检索整理)
人工智能·chatgpt
渡我白衣7 分钟前
计算机组成原理(5):计算机的性能指标
服务器·网络·c++·人工智能·网络协议·tcp/ip·网络安全
新知图书7 分钟前
智能体的自适应学习
人工智能·ai agent·智能体·大模型应用开发·大模型应用
GMICLOUD9 分钟前
GMI Cloud@AI周报|GPT 5.2 重磅发布;智谱AI GLM-4.6V开源;
人工智能·gpt·业界资讯
草莓熊Lotso11 分钟前
Python 基础语法完全指南:变量、类型、运算符与输入输出(零基础入门)
运维·开发语言·人工智能·经验分享·笔记·python·其他