Batchwise convolutions——对于每个 batch 元素不同的权重

问题描述 投票:0回答:1

给定输入

x
,其形状为
(32, 4, 16)
。对于此输入,应应用卷积 (conv1d)。请注意,有
4
输入通道。这些通道中的每一个都具有
16
的维度。批量大小为
32
。下面假设输出通道数为
8
。因此,
weight
的形状为
(8, 4, 1)

总的来说,我们得到了以下代码:

batch_size = 32
input_channels = 4
output_channels = 8
dim = 16

x = torch.zeros(size=(batch_size, input_channels, dim))
weight = torch.rand(size=(output_channels, input_channels, 1))
y = F.conv1d(x, weight)

现在我的问题: 我不想对每个批次元素应用 same 权重,而是想对每个批次元素应用 different 权重。换句话说,

weight
必须具有
(32, 8, 4, 1)
的形状。 我如何实现这种批量卷积操作?

如果

weight
分配给
torch.rand(size=(batch_size, output_channels, input_channels, 1))
则代码不起作用。 当然,存在一个基于 for 循环的简单解决方案。 我正在寻找没有 for-loop 的解决方案。

pytorch tensor torch convolution
1个回答
0
投票
具有形状为

(1)

 的核的
Conv1d 与广播乘法与减和相同。具体

# x.shape (32, 4, 16)
# weight.shape (8, 4, 1)

y = (x.unsqueeze(1) * weight.unsqueeze(0)).sum(dim=2)
# equivalent to y = F.conv1d(x, weight)
# equivalent to y = torch.einsum('bin,oin->bon', x, weight)

所以如果我们假设重量有形状

(32, 8, 4, 1)
那么我们就不需要在第一维上广播。

# x.shape (32, 4, 16)
# weight.shape (32, 8, 4, 1)

y = (x.unsqueeze(1) * weight).sum(dim=2)
# equivalent to y = torch.einsum('bin,boin->bon', x, weight)
© www.soinside.com 2019 - 2024. All rights reserved.