【发布时间】:2017-12-25 19:51:06
【问题描述】:
我想保存我的 LSTM 的最终状态,以便在我恢复模型时包含它并可用于预测。如下所述,当我使用tf.assign 时,Saver 只知道最终状态。但是,这会引发错误(也在下面解释)。
在训练期间,我总是将最终的 LSTM 状态反馈回网络,如 this post 中所述。以下是代码的重要部分:
构建图表时:
self.init_state = tf.placeholder(tf.float32, [
self.n_layers, 2, self.batch_size, self.n_hidden
])
state_per_layer_list = tf.unstack(self.init_state, axis=0)
rnn_tuple_state = tuple([
tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0],
state_per_layer_list[idx][1])
for idx in range(self.n_layers)
])
outputs, self.final_state = tf.nn.dynamic_rnn(
cell, inputs=self.inputs, initial_state=rnn_tuple_state)
在训练期间:
_current_state = np.zeros((self.n_layers, 2, self.batch_size,
self.n_hidden))
_train_step, _current_state, _loss, _acc, summary = self.sess.run(
[
self.train_step, self.final_state,
self.merged
],
feed_dict={self.inputs: _inputs,
self.labels:_labels,
self.init_state: _current_state})
当我稍后从检查点恢复我的模型时,最终状态也没有恢复。正如this post 中所述,问题在于 Saver 不知道新状态。该帖子还提出了一个基于tf.assign 的解决方案。很遗憾,我不能使用建议的
assign_op = tf.assign(self.init_state, _current_state)
self.sess.run(assign_op)
因为 self.init 状态不是变量而是占位符。我收到错误
AttributeError: 'Tensor' 对象没有属性 'assign'
我已经尝试解决这个问题几个小时了,但我无法让它工作。
感谢任何帮助!
编辑:
我已将 self.init_state 更改为
self.init_state = tf.get_variable('saved_state', shape=
[self.n_layers, 2, self.batch_size, self.n_hidden])
state_per_layer_list = tf.unstack(self.init_state, axis=0)
rnn_tuple_state = tuple([
tf.contrib.rnn.LSTMStateTuple(state_per_layer_list[idx][0],
state_per_layer_list[idx][1])
for idx in range(self.n_layers)
])
outputs, self.final_state = tf.nn.dynamic_rnn(
cell, inputs=self.inputs, initial_state=rnn_tuple_state)
在训练期间,我没有为 self.init_state 提供值:
_train_step, _current_state, _loss, _acc, summary = self.sess.run(
[
self.train_step, self.final_state,
self.merged
],
feed_dict={self.inputs: _inputs,
self.labels:_labels})
但是,我仍然无法运行分配操作。知道我得到了
TypeError:预期的 float32 传递给 op 'Assign' 的参数 'value',得到 (LSTMStateTuple(c=array([[ 0.07291573, -0.06366599, -0.23425588, ..., 0.05307654,
【问题讨论】:
-
您的问题真的看起来像您链接的问题的副本。接受的答案确实建议您将占位符转换为 tf.Variable,以便您可以使用 TensorFlow 分配操作更新网络中的状态。
-
是的,我试过了。也许我在转换它时犯了一个错误。如何正确将其转换为 tf.Variable?使用 self.init_state = tf.Variable(self.init_state) 初始化所有变量时会抛出错误
-
我改变了原来的问题(见编辑)。它仍然无法按照其他帖子中解释的方式工作。我错过了什么吗?
标签: python machine-learning tensorflow lstm rnn