モデルを復元して予測に使用できるようにLSTMの最終状態を保存します。以下で説明するように、Saverはtf.assign
を使用すると最終状態の知識しか持ちません。ただし、これによりエラーが発生します(後述)。Tensorflowは、予測のためにdynamic_rnnのLSTMの最終状態を保存します。
トレーニング中は、this postで説明されているように、私はいつも最後のLSTM状態をネットワークに戻します。ここでは、コードの重要な部分です:
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
に基づいた解決法も提案しています。 self.init状態は変数が、プレースホルダではないので、残念ながら、私が提案し
assign_op = tf.assign(self.init_state, _current_state)
self.sess.run(assign_op)
を使用することはできません。 「テンソル」オブジェクトが、私は今、数時間、この問題を解決することを試みたが、私はそれを動作させることはできません
「を割り当てる」は属性を持っていない:私はエラー
はAttributeErrorを取得します。
ご協力いただきましてありがとうございます。
EDIT:
私が変更されている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})
、私はまだ割り当てopを実行することはできません。予想される、 '割り当て' オペアンプの 'の値を' パラメータに渡された(LSTMStateTuple(C =配列([[0.07291573、-0.06366599、-0.23425588、...、0.05307654、
あなたの質問はあなたがリンクしたものと重複しているようです。受け入れられた答えは、プレースホルダをtf.Variableに変えることを示唆しているため、TensorFlowの割り当て操作でネットワークの状態を更新することができます。 –
はい、私はそれを試みました。たぶん、私はそれを変えるときに間違いをしています。どのようにtf.Variableに変換するのですか? self.init_state = tf.Variable(self.init_state)を使用すると、すべての変数を初期化するときにエラーが発生する – Lemon
元の質問を変更しました(編集を参照)。それはそれが他のポストで説明された方法ではまだ動作しません。何か不足していますか? – Lemon