pytorch lstm教程初始化变量
pytorch lstm tutorial initializing Variable
我正在阅读 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)) 有什么区别?
首先快速回答第 2 个问题:它们是相同的。我不知道为什么他们会做不同的事情。
接下来回答问题1:
hidden
是一个包含两个 Variables
的元组,它们本质上是一个 1 x 1 x 3
张量。
让我们关注一下(0 ,.,.)
。如果你有一个 2 x 2
张量而不是 1 x 1 x 3
张量,你可以简单地打印出如下内容:
0.1 0.2
0.3 0.4
但在屏幕上表现 3 维事物有点困难。尽管有点傻,但在开头添加附加的 1
会将原本是 2 维张量的内容更改为 3 维张量。因此,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]
正如您所见,张量中的每个元素实际上都已初始化。
我正在阅读 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)) 有什么区别?
首先快速回答第 2 个问题:它们是相同的。我不知道为什么他们会做不同的事情。
接下来回答问题1:
hidden
是一个包含两个 Variables
的元组,它们本质上是一个 1 x 1 x 3
张量。
让我们关注一下(0 ,.,.)
。如果你有一个 2 x 2
张量而不是 1 x 1 x 3
张量,你可以简单地打印出如下内容:
0.1 0.2
0.3 0.4
但在屏幕上表现 3 维事物有点困难。尽管有点傻,但在开头添加附加的 1
会将原本是 2 维张量的内容更改为 3 维张量。因此,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]
正如您所见,张量中的每个元素实际上都已初始化。