在pytorch中有没有干净的方法来创建一批3D序列?(sequence_length_lvl1,sequence_length_lvl2,D),这些序列的sequence_length_lvl1和sequence_length_lvl2的值不同,但它们的D值都相同,我想在第一维和第二维中填充这些序列,并创建一批序列,但是我不能使用pytorch pad_sequence函数,因为它只在序列只有一维长度可变的情况下才有效。我想问一下,是否有人知道什么简单的方法来实现这一点?
为了更清楚起见,我提供了一个例子。假设输入序列如下:
input1 = [
[[1, 1, 1], [2, 2, 2], [3, 3, 3]],
[[4, 4, 4], [5, 5, 5]]
]
input2 = [
[[1, 1, 1], [2, 2, 2], [3, 3, 3]],
[[6, 6, 6]],
[[4, 4, 4], [5, 5, 5]]
]
我想填充[input1,input2]。所需的输出将是:
output = [
[[[1, 1, 1], [2, 2, 2], [3, 3, 3]],
[[4, 4, 4], [5, 5, 5], [0, 0, 0]],
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]],
[[[1, 1, 1], [2, 2, 2], [3, 3, 3]],
[[6, 6, 6], [0, 0, 0], [0, 0, 0]],
[[4, 4, 4], [5, 5, 5], [0, 0, 0]]]
]
因此,期望输出具有(2,3,3,3)的形状。
5条答案
按热度按时间flvtvl501#
这对你的例子有效,也许有更快的方法。
z2acfund2#
您可以使用text2array库,该库可以执行此类填充 *,无论序列嵌套有多深 *(免责声明:我是作者)。使用
pip install text2array
安装,然后:将打印
输出是一个NumPy数组,但您可以很容易地将其转换为带有
torch.from_numpy
的PyTorchTensor。cclgggtu3#
我不确定
pytorch
数据结构,但如果它们是类似list
的数据,您可以使用我的解决方案。此功能用于填充每个维度中的缺失值(即宽度、高度和深度)与
0
进行比较,将尺寸调整为与最大尺寸相同。* 这可以应用于任意数量的输入,而不仅仅是2*。首先,找到所有输入的最大宽度、最大高度和最大深度(例如,input1
和input2
)。之后,对于每个输入,用0
填充缺失的单元格,然后将它们连接在一起。此方法不需要任何其他库。
如果你认为上面的代码太长,下面是上面函数的更短更清晰(列表理解)的版本(但是很难阅读和理解):
示例
输出:
如果要将输出用作
numpy array
,可以使用np.array()
,如下所示:vcudknz34#
您仍然可以使用pad_sequence执行此操作,但必须包含一个初始for循环,以使倒数第二个维度均匀。
这只需要使用一个for循环就可以创建所需的Tensor。
输出量:
rpppsulh5#
要在PyTorch中创建一批3D序列,可以使用
torch.nn.utils.rnn.pad_sequence
函数。该函数允许您指定填充值,在您的情况下,填充值应该是一个与序列形状相同的零Tensor(即(sequence_length_lvl1, sequence_length_lvl2, D)
)。示例:
这应该会产生所需的输出shape(2,3,3,3)。请注意,
pad_sequence
会自动将第一个和第二个维度中的序列填补至批次中所有序列中每个维度的最大长度。在此情况下,第一个维度会填补至长度3,第二个维度会填补至长度3。输出: