如何在PyTorch的conv2d函数中使用自定义卷积核完成矩阵卷积运算
PyTorch conv2d 单通道矩阵卷积正确调用方式
错误原因
- 参数名错误:
torch.nn.functional.conv2d没有mode参数,控制填充模式的参数为padding,传padding='same'即可实现输出尺寸和输入一致。 - 张量维度不符合要求:conv2d是为批量多通道卷积设计的,维度要求为:
- 输入张量:
(批量大小, 输入通道数, 高度, 宽度) - 卷积核张量:
(输出通道数, 输入通道数, 卷积核高度, 卷积核宽度)
当前你持有的输入矩阵是形状为(6,6)的二维张量,卷积核是形状为(3,3)的二维张量,均缺少批量、通道维度。
- 输入张量:
正确实现代码
首先修正原代码中Z_numpy的笔误(应为m_numpy),再调整张量维度后调用即可:
import numpy as np import torch import torch.nn.functional as F # 构造输入矩阵 np.random.seed(0) m_numpy = np.random.choice([0,1],p=(0.5,0.5),size=(6,6)) m = torch.from_numpy(m_numpy).type(torch.FloatTensor) # 扩充维度:变为 [批量大小=1, 输入通道数=1, 高度=6, 宽度=6] m = m.unsqueeze(0).unsqueeze(0) # 构造卷积核 krnl = torch.tensor([[1,1,1], [1,0,1], [1,1,1]]).type(torch.FloatTensor) # 扩充维度:变为 [输出通道数=1, 输入通道数=1, 卷积核高=3, 卷积核宽=3] krnl = krnl.unsqueeze(0).unsqueeze(0) # 执行卷积运算 output = F.conv2d(m, krnl, bias=None, padding='same', stride=1) # 提取二维卷积结果(去掉批量、通道维度) output_2d = output.squeeze()
补充说明
如果使用的PyTorch版本较低,不支持字符串形式的padding='same',可以手动传入填充数值:3x3卷积核要实现输入输出尺寸一致,只需设置padding=1即可,兼容性更好。
内容的提问来源于stack exchange,提问作者user13467695
相关产品推荐
相关产品推荐

