首页 文章

pytorch lstm tutorial初始化变量

提问于
浏览
0

我正在浏览lstm的pytorch教程,这里是他们使用的代码:

lstm = nn.LSTM(3, 3)  # Input dim is 3, output dim is 3
inputs = [autograd.Variable(torch.randn((1, 3)))
          for _ in range(5)]  # make a sequence of length 5

# initialize the hidden state.
hidden = (autograd.Variable(torch.randn(1, 1, 3)),
          autograd.Variable(torch.randn((1, 1, 3))))
for i in inputs:
    # Step through the sequence one element at a time.
    # after each step, hidden contains the hidden state.
    out, hidden = lstm(i.view(1, 1, -1), hidden)

对于变量 hidden ,它初始化为元组,结果为:

(Variable containing:
(0 ,.,.) = 
  0.4251 -1.2328 -0.6195
[torch.FloatTensor of size 1x1x3]
, Variable containing:
(0 ,.,.) = 
  1.5133  1.9954 -0.6585
[torch.FloatTensor of size 1x1x3]
)

我不明白的是

  • (0, . , . )是一个索引吗?从我们说过(torch.randn(1,1,3))以后它不应该初始化所有三个数字吗?

  • torch.randn(1,1,3)和torch.randn((1,1,3))有什么区别?

1 回答

  • 1

    首先快速回答2号:它们是相同的 . 我不知道他们为什么会这样做 .

    接下来,回答问题1:

    hidden 是一个包含两个 Variables 的元组,它们本质上是一个 1 x 1 x 3 张量 .

    让我们关注 (0 ,.,.) . 如果不是 1 x 1 x 3 张量而是一个 2 x 2 张量,你可以简单地打印出如下内容:

    0.1 0.2
    0.3 0.4
    

    但是它有点愚蠢,在开头有一个附加的 1 会改变二维张量变成三维张量 . 所以,相反,Pytorch打印出张量的"slices" . 在这种情况下,您只有一个恰好是零切片的"slice" . 因此,您可以获得额外的 (0, ,.,.) 而不是仅仅打印出来

    0.4251 -1.2328 -0.6195
    

    如果相反尺寸是 2 x 1 x 3 ,您可以期望输出如下:

    (0 ,.,.) = 
     -0.3027 -1.1077  0.4724
    
    (1 ,.,.) = 
      1.0063 -0.5936 -1.1589
    [torch.FloatTensor of size 2x1x3]
    

    正如您所看到的那样,张量中的每个元素都被初始化 .

相关问题