【发布时间】:2021-10-20 19:15:23
【问题描述】:
我有一个 3D 张量,每个通道都与单个内核进行卷积。通过快速搜索,最快的方法是使用分组卷积,将组数作为通道数。
这是一个可重现的小例子:
import torch
import torch.nn as nn
torch.manual_seed(0)
x = torch.rand(1, 3, 3, 3)
first = x[:, 0:1, ...]
second = x[:, 1:2, ...]
third = x[:, 2:3, ...]
kernel = nn.Conv2d(1, 1, 3)
conv = nn.Conv2d(3, 3, 3, groups=3)
conv.weight.data = kernel.weight.data.repeat(3, 1, 1, 1)
conv.bias.data = kernel.bias.data.repeat(3)
>>> conv(x)
tensor([[[[-1.0085]],
[[-1.0068]],
[[-1.0451]]]], grad_fn=<MkldnnConvolutionBackward>)
>>> kernel(first), kernel(second), kernel(third)
(tensor([[[[-1.0085]]]], grad_fn=<ThnnConv2DBackward>),
tensor([[[[-1.0068]]]], grad_fn=<ThnnConv2DBackward>),
tensor([[[[-1.0451]]]], grad_fn=<ThnnConv2DBackward>))
你可以看到完美的作品。
现在来回答我的问题。我需要对此进行反向传播(kernel 对象)。在执行此操作时,conv 的每个权重都会得到自己的更新。但实际上,conv 是由重复 3 次的 kernel 组成的。最后,我只需要更新的kernel。我该怎么做?
PS:我需要优化速度
【问题讨论】:
标签: python pytorch computer-vision conv-neural-network backpropagation