给定输入
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 的解决方案。
(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)