状态的传递

来源: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。

0
0

Google老师亲授 TensorFlow2.0 入门到进阶

Tensorflow2.0实战—以实战促理论的方式学习深度学习

1849 学习 · 896 问题

查看课程