这是如何构建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],....
答案 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)