【可视化3D卷积计算过程】
创作时间:
作者:
@小白创作中心
【可视化3D卷积计算过程】
引用
CSDN
1.
https://blog.csdn.net/qq_44166630/article/details/138320939
3D卷积可以用来处理视频输入,对于图片来讲,shape为:[C_in, H, W]。而视频多了时间这一维度,因此视频的shape为:[C_in, D, H, W],其中D为帧数(frame),比如一条视频有10帧,则D=10。(以上都忽略了batch size N)
假如我们现在的输入的视频shape为:[3, 7, 4, 4]。即:
input_channel frame H W
3 7 4 4
kernel shape为:[5, 3, 2, 2, 2]
output_channel input_channel kernel_D kernel_H kernel_W
5 3 2 2 2
计算过程可视化如下:
output shape为:[5, 6, 3, 3],其中:
output_channel output_D output_H output_W
5 6 3 3
代码验证
import torch
import torch.nn as nn
N, C_in, D, H, W = 1, 3, 7, 4, 4
C_out = 5
m = nn.Conv3d(in_channels=C_in, out_channels=C_out, kernel_size=2, stride=1, bias=False)
inputs = torch.zeros(N, C, D, H, W)
m.weight = nn.Parameter(torch.ones(C_out, C_in, 2, 2, 2))
inputs[:, 0, :, :, :] = torch.ones(D, H, W)
inputs[:, 1, :, :, :] = torch.ones(D, H, W) * 2
inputs[:, 2, :, :, :] = torch.ones(D, H, W) * 3
output = m(inputs)
print(inputs, inputs.shape)
"""
tensor([[[[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]],
[[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]],
[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]],
[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]],
[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]],
[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]],
[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]],
[[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]]],
[[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]]]]])
shape:
torch.Size([1, 3, 7, 4, 4])
"""
print(output, output.shape)
"""
tensor([[[[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]]],
[[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]]],
[[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]]],
[[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]]],
[[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]],
[[48., 48., 48.],
[48., 48., 48.],
[48., 48., 48.]]]]], grad_fn=<SlowConv3DBackward0>)
shape:
torch.Size([1, 5, 6, 3, 3])
"""
48怎么来的?
2x2x2x1 + 2x2x2x2 + 2x2x2x3 = 48
热门推荐
广州免费景点摄影攻略:海珠湖、海心桥、中山大学
汽车油门调整全攻略:步骤、注意事项与安全驾驶提示
汽车速度控制:硬件、系统与驾驶技巧的综合讲解
PC直播掉帧问题大解析:你必须了解的几个关键因素
AI无人直播的封号风险及预防措施
心理学小技巧:提升生活幸福感的实用指南
眼结膜炎的症状和治疗方法
马克思主义哲学:过好一生的秘密武器
深入解析CPU缓存层级:优化多核处理器性能的关键之道
充血的类型及原因
熊拯救地球:生态系统守护者
蜀南竹海七彩飞瀑和天宝寨升级进行时!
西伯利亚棕熊:真正的“战斗力之王”
从棕熊的战斗力看野外求生技巧
Excel中显示日期对应星期几的三种方法
用这9个简单的时间管理技巧优化你的工作表现
什么是电池电压检测
IT界的大神-001-阿兰·图灵 (Alan Turing)
黑色羽绒服+牛仔裤:冬日里的经典时尚搭配
从枪毙到注射:中国死刑执行方式的文明演进
如何让耳朵保持“年轻”?——全国老年健康宣传周听力保健指南
重视老年听力损失,提高老年生活质量
《哪吒2》冲击中国影史票房新纪录,谁是最大赢家?
重庆网红打卡攻略:从洪崖洞到李子坝的轻轨之旅
粤港澳大湾区法治论坛:专家学者热议AI如何改变法律行业
AI对公益事业的深刻改变
氦氖激光器的应用
手酸、手麻、手腕疼?你可能患了“鼠标手”!
锂离子电池充电的秘密大揭秘!
汽车电池充电与维护全攻略