状态的传递
来源:10-7 损失函数与单步训练函数
wxz123
2020-01-24
1、老师这个单步训练的decoder是怎么保证上一时间步的状态能够传到下一时间步的
2、这个decoder的output, state = self.gru(x)
为什么不像encoderoutput, state = self.gru(x, initial_state = hidden)
一样设置initial_state = hidden
参数呢,decoder不需要状态的初始化吗
3、以下理解是否正确
对于
keras.layers.SimpleRNN
我这样理解,不调用fit
函数时RNN单元中的state永远会在下一个时间步传入该RNN单元作为状态输入,但当调用fit
函数时,当完成了一个batch的(假如有n个时间步)n次循环后,进入下一个batch前,此时会自动调用model.reset_states()
来重新初始化状态,若在keras.layers.SimpleRNN
设置了stateful = True
参数后,就不会有在完成了一个batch后,进入下一个batch前,自动调用model.reset_states()
来重新初始化状态这一操作了
1回答
-
正十七
2020-02-26
先回答问题1和2,
可以参考GRU的API文档,https://www.tensorflow.org/api_docs/python/tf/keras/layers/GRU
可以看到,initial_state只给第一次调用这个的时候用,然后如果没有默认就是全0的矩阵。
然后回到我们的encoder和decoder的实现,encoder中,我们调用initialize_hidden_state来初始化hidden state, 这一步也是初始化为0的矩阵,这里是让大家知道这个东西的shape,在调GRU的时候带不带这个参数是一样的。
而且,initial_state是只在初始化的时候有用,在中间步骤中是无效的,因为此时,GRU会自带隐含状态。而在encoder和decoder中的使用也有不同,encoder中,处理的x是一个长度为n的一维向量,即一个句子。这里只有一次调用就一下子处理了整个句子,因为只有一次调用,所以传initial_state是对的。而在decoder中,因为要每一步计算attention,所以GRU的调用是一步一步的,此时如果每次传initial_state就不对了,因为它只有第一步调用的时候起作用。
总而言之,一句话那就是GRU的中间状态是有cell自动传的,我们能够改变的只是初始化的状态。
问题3,你的理解是对的。stateful = True控制的就是状态会不会传到下一个batch。
00
相似问题