请 问一下 y, (h, c) = rnn(x, (prev_h, prev_c))这句话怎么实现的? 小括号 返回什么?,h和c保持不变的意思么?
LSTM模型里面,16,32,2分别是啥意思?
import paddle
rnn = paddle.nn.LSTM(16, 32, 2)
x = paddle.randn((4, 23, 16))
prev_h = paddle.randn((2, 4, 32))
prev_c = paddle.randn((2, 4, 32))
y, (h, c) = rnn(x, (prev_h, prev_c))
print(y.shape)
print(h.shape)
print(c.shape)
这是python的解构赋值
比如 rnn(x, (prev_h, prev_c)) 返回的是 (1,(2,3)) 这样嵌套的元组
y, (h, c) = rnn(x, (prev_h, prev_c))
就等于是y, (h, c) = (1,(2,3))
意思是把=号右边元组的元素拆开,并顺序的赋给=号左边的多个变量
左边接纳的元组结构和变量数要与右边解开的元组结构和元素个数一致。
也就是y赋值为1,h赋值为2,c赋值为3
你这是把深度学习的知识当成语法问题来问了,hc表示状态自然不需要改变形状
我写过一篇torch里调用LSTM的参数解释,有兴趣可以参考一下
rnn = paddle.nn.LSTM(16, 32, 2)
16输入x大小。
32隐藏状态 h大小。
2循环网络的层数。
y, (h, c) = rnn(x, (prev_h, prev_c))
x: 网络输入。
(prev_h, prev_c):网络的初始状态,一个包含h和c的元组,形状为[num_layers * num_directions, batch_size, hidden_size]。
y:输出,由前向和后向cell的输出拼接得到。如果time_major为True,则Tensor的形状为[time_steps,batch_size,num_directions * hidden_size],如果time_major为False,则Tensor的形状为[batch_size,time_steps,num_directions * hidden_size],当direction设置为bidirectional时,num_directions等于2,否则等于1。time_steps 指输出序列的长度。
(h, c):最终状态,一个包含h和c的元组。形状为[num_layers * num_directions, batch_size, hidden_size]
h和c保持不变
h和c不会是会变的,作为上一次的输出,下一次的输入