import torch
from torch.nn import functional as f
inp = torch.randn(2, 3, 4, 5)
w = torch.randn(2, 3, 3, 3)
inp_unf = torch.nn.functional.unfold(inp, (3, 3)) # [2,27,6]
out_unf = inp_unf.transpose(1, 2).matmul(w.view(w.size(0), -1).t()).transpose(1, 2)
out = torch.nn.functional.fold(out_unf, (2, 3), (1, 1)) #[2,2,2,3]
print((torch.nn.functional.conv2d(inp, w) - out).abs().max())
#tensor(9.5367e-07)
卷积核(3*3),对应的unfold操作示意图如图一。比如一个大小为(2,3,4,5)的特征,经过Unfold之后得到 f(2,27,6)
那么卷积操作就可以直接将卷积核w(比如尺寸为(2,3,3,3)大小的卷积核)reshape 成 (2,27),f与w转置之后, 直接利用矩阵相乘再转置,求得结果out,(2,2,6),再torch.nn.functional.fold(out , (2, 3), (1, 1)) .