从其批处理版本重建火炬张量

时间:2019-09-26 17:50:53

标签: numpy machine-learning pytorch feature-extraction torch

这是如何构建3D张量的非常好的示例:

import torch
y = torch.rand(100, 1)
batch_size = 10
batched_data = y.contiguous().view(batch_size, -1, y.size(-1)).transpose(0,1)
batched_data.shape

输出为:

torch.Size([10, 10, 1])

好的,现在我要做的是,从要构建y的batched_data开始。 另一种方式。 强大的pytorch简化代码有什么好的建议吗?

====附加输入=====

我正在将其用于RNN,现在我有一些疑问,因为如果您考虑以下代码:

import torch
y = torch.arange(100).view(100,1)
batch_size = 10
batched_data = y.contiguous().view(batch_size, -1, y.size(-1)).transpose(0,1)
batched_data.shape

输出为:

tensor([[[ 0],
         [10],
         [20],
         [30],
         [40],
         [50],
         [60],
         [70],
         [80],
         [90]],

        [[ 1],
         [11],
         [21],
         [31],
         [41],
         [51],
         [61],
         [71],
         [81],
         [91]],

我没想到。我希望这样的事情: [[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20],....

2 个答案:

答案 0 :(得分:1)

如果要为RNN准备输入,则需要知道RNN的形状为seq_len, batch, input_size的3d张量。这里的input_size是指要素的数量,在您的场景中为1。因此,形状为10, 10, 1的输入张量仍然可以作为RNN的有效输入。

示例

rnn = nn.RNN(input_size=1, hidden_size=20, num_layers=1)
input = torch.randn(10, 10, 1)
output, hn = rnn(input)
print(output.size()) # 10, 10, 20

RNN的输出形状为seq_len, batch, num_directions * hidden_size

答案 1 :(得分:0)

假设您要执行以下操作来重建y:

rebuilded_y = batched_data.transpose(0,1).view(*y.shape)

要使输入看起来像您期望的那样,您需要删除batched_data中的转置和附加维:

batched_data = y.contiguous().view(batch_size, -1)