pytorch - 给定长度列表,重塑和填充张量
问题描述
我给出了一个in
形状a x b
如下的二维张量(其中, , ...中的a = 9
每一个都代表一个维向量):A1
A2
C2
b
此外,我有一个数组lengths
,其中sum(lengths) = a
每个条目都是一个正整数:
然后我想获得一个 3d 输出张量out
,其中第一个lengths[0]
条目in
形成第一行,下一个lengths[1]
条目in
形成第二行,依此类推。也就是说,输出张量的形状应该是len(lengths) x max(lengths) x b
,并用零填充(0
下图中的每个表示一个一b
维零向量):
由于这是使用反向传播训练的神经网络的一部分,因此使用的所有操作都必须是可微的。如何使用 PyTorch实现这一点(理想情况下,具有良好的性能)?
解决方案
这是我使用的实现torch.nn.utils.rnn.pad_sequence()
:
in_tensor = torch.rand((9, 3))
print(in_tensor)
print(36*'=')
lengths = torch.tensor([3, 4, 2])
cum_len = 0
y = []
for idx, val in enumerate(lengths):
y.append(in_tensor[cum_len : cum_len+val])
cum_len += val
print(torch.nn.utils.rnn.pad_sequence(y, batch_first=True)))
输出:
# in_tensor of shape (9 x 3)
tensor([[0.9169, 0.3549, 0.6211],
[0.4832, 0.5475, 0.8862],
[0.8708, 0.5462, 0.9374],
[0.4605, 0.1167, 0.5842],
[0.1670, 0.2862, 0.0378],
[0.2438, 0.5742, 0.4907],
[0.1045, 0.5294, 0.5262],
[0.0805, 0.2065, 0.2080],
[0.6417, 0.4479, 0.0688]])
====================================
# out tensor of shape (len(lengths) x max(lengths) x b), in this case b is 3
tensor([[[0.9169, 0.3549, 0.6211],
[0.4832, 0.5475, 0.8862],
[0.8708, 0.5462, 0.9374],
[0.0000, 0.0000, 0.0000]],
[[0.4605, 0.1167, 0.5842],
[0.1670, 0.2862, 0.0378],
[0.2438, 0.5742, 0.4907],
[0.1045, 0.5294, 0.5262]],
[[0.0805, 0.2065, 0.2080],
[0.6417, 0.4479, 0.0688],
[0.0000, 0.0000, 0.0000],
[0.0000, 0.0000, 0.0000]]])
推荐阅读
- mongodb - Mongodb将集合用作循环的最佳方法是什么
- python - 获取numpy数组中的行,其中列包含字符串
- ruby-on-rails - 如何在 Rails 中创建具有 NULLS LAST 的索引?
- authentication - ELK - X-Pack 自定义领域
- angular-material2 - 自动完成 - 以编程方式选择选项
- ios - 在谷歌地图iOS SDK中获取两点之间的方向
- php - PHP 检查编号字符串是否遵循模式
- r - 如何仅删除 R 中所有 NA 的行?
- python - 如何在python中的字符串中使用\
- tensorflow - 预编译的 Tensorflow - 以编程方式获取它所针对的 CUDA 和 CUDNN 版本