将初始状态输入到LSTMCell

我在参考此代码 https://github.com/martin-gorner/tensorflow-rnn-shakespeare/blob/master/rnn_train.py,并试图将单元从GRUCell转换为LSTMCell。以下是代码摘录。

# 输入状态Hin = tf.placeholder(tf.float32, [None, INTERNALSIZE * NLAYERS], name='Hin')  # [ BATCHSIZE, INTERNALSIZE * NLAYERS]# 使用3层的GRU单元,展开30次# dynamic_rnn从输入Xo的大小推断SEQLEN# 如何在RNN中正确应用dropout:请参阅README.mdcells = [rnn.GRUCell(INTERNALSIZE) for _ in range(NLAYERS)]# "naive dropout"实现dropcells = [rnn.DropoutWrapper(cell, input_keep_prob=pkeep) for cell in cells]multicell = rnn.MultiRNNCell(dropcells, state_is_tuple=False)multicell = rnn.DropoutWrapper(multicell, output_keep_prob=pkeep)  # softmax层dropoutYr, H = tf.nn.dynamic_rnn(multicell, Xo, dtype=tf.float32, initial_state=Hin)# Yr: [ BATCHSIZE, SEQLEN, INTERNALSIZE ]# H:  [ BATCHSIZE, INTERNALSIZE*NLAYERS ] # 这是序列中的最后一个状态H = tf.identity(H, name='H')  # 只是给它一个名字

我知道LSTMCell有两个状态,单元状态C和输出状态H。我想做的是为initial_state提供一个包含这两个状态的元组。我该如何正确地做到这一点?我尝试了各种方法,但总是遇到tensorflow错误。

编辑:这是我的一次尝试:

# 输入X = tf.placeholder(tf.uint8, [None, None], name='X')  # [ BATCHSIZE, SEQLEN ]Xo = tf.one_hot(X, ALPHASIZE, 1.0, 0.0)  # [ BATCHSIZE, SEQLEN, ALPHASIZE ]# 预期输出 = 相同的序列但向后移一位,因为我们试图预测下一个字符Y_ = tf.placeholder(tf.uint8, [None, None], name='Y_')  # [ BATCHSIZE, SEQLEN ]Yo_ = tf.one_hot(Y_, ALPHASIZE, 1.0, 0.0)  # [ BATCHSIZE, SEQLEN, ALPHASIZE ]# 输入状态Hin = tf.placeholder(tf.float32, [None, INTERNALSIZE * NLAYERS], name='Hin')  # [ BATCHSIZE, INTERNALSIZE * NLAYERS]Cin = tf.placeholder(tf.float32, [None, INTERNALSIZE * NLAYERS], name='Cin')initial_state = tf.nn.rnn_cell.LSTMStateTuple(Cin, Hin)# 使用3层的GRU单元,展开30次# dynamic_rnn从输入Xo的大小推断SEQLEN# 如何在RNN中正确应用dropout:请参阅README.mdcells = [rnn.LSTMCell(INTERNALSIZE) for _ in range(NLAYERS)]# "naive dropout"实现dropcells = [rnn.DropoutWrapper(cell, input_keep_prob=pkeep) for cell in cells]multicell = rnn.MultiRNNCell(dropcells, state_is_tuple=True)multicell = rnn.DropoutWrapper(multicell, output_keep_prob=pkeep)  # softmax层dropoutYr, H = tf.nn.dynamic_rnn(multicell, Xo, dtype=tf.float32, initial_state=initial_state)

它显示”TypeError: ‘Tensor’ object is not iterable.”

谢谢。


回答:

错误发生的原因是您必须在构建图形时为每一层单独提供一个占位符的元组,然后在训练时,您必须为第一层提供状态。

错误的意思是:我需要遍历一个包含多个单元状态的列表(元组),因为您有多个单元,我需要初始化它们的所有状态,但我看到的只是一个Tensor,我无法遍历它。

这个代码片段展示了如何在构建图形时设置占位符:

state_size = 10num_layers = 3X = tf.placeholder(tf.float32, [None, 100, 10])# 第二个维度大小为2,代表# c, m(单元状态和隐藏状态)# 将batch_size设置为None state_placeholder = tf.placeholder(tf.float32, [num_layers, 2,                                     None, state_size])# l是层数占位符 l = tf.unstack(state_placeholder, axis=0)然后我们为每一层创建一个LSTMStateTuple的元组rnn_tuple_state = tuple(         [rnn.LSTMStateTuple(l[idx][0],l[idx][1])          for idx in range(num_layers)])# 在这里我必须设置resuse = True:tf.__version__ 1.7.0cells  = [rnn.LSTMCell(10, reuse=True)] * num_layersmc = rnn.MultiRNNCell(cells, state_is_tuple=True)outputs, state = tf.nn.dynamic_rnn(cell=mc,                                   inputs=X,                                   initial_state=rnn_tuple_state,                                   dtype=tf.float32)

这是文档中相关的部分:

initial_state: (可选)RNN的初始状态。如果cell.state_size是一个整数,则必须是适当类型和形状的Tensor [batch_size, cell.state_size]。

所以我们最终为每个单元(层)创建了一个具有所需大小的占位符元组。(batch_size, state_size),其中batch_size = None。我在这个答案中详细解释了这一点

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注