誰かがテンソルフローでLSTMの非表示状態を初期化する方法を説明できますか? LSTM反復オートエンコーダーを構築しようとしているので、そのモデルをトレーニングした後、学習した教師なしモデルの非表示状態を教師ありモデルの非表示状態に転送したいと思います。それは現在のAPIでも可能ですか?これは私が再現しようとしている紙です:
http://papers.nips.cc/paper/5949-semi-supervised-sequence-learning.pdf
はい-これは可能ですが、本当に面倒です。例を見てみましょう。
モデルの定義:
_from keras.layers import LSTM, Input
from keras.models import Model
input = Input(batch_shape=(32, 10, 1))
lstm_layer = LSTM(10, stateful=True)(input)
model = Model(input, lstm_layer)
model.compile(optimizer="adam", loss="mse")
_
コンパイルでは初期状態がリセットされるため、最初にモデルをビルドしてコンパイルすることが重要です。さらに、_batch_shape
_を指定する必要があります。このシナリオでは、ネットワークはstateful
である必要があるため、_batch_size
_が指定されます(これは、_stateful=True
_モードを設定することによって行われます。
これで、初期状態の値を設定できます。
_import numpy
import keras.backend as K
hidden_states = K.variable(value=numpy.random.normal(size=(32, 10)))
cell_states = K.variable(value=numpy.random.normal(size=(32, 10)))
model.layers[1].states[0] = hidden_states
model.layers[1].states[1] = cell_states
_
状態をkeras
変数として提供する必要があることに注意してください。 _states[0]
_は非表示の状態を保持し、_states[1]
_はセルの状態を保持します。
お役に立てば幸いです。
RNNがレイヤー1にあり、非表示/セル状態がnumpy配列であると仮定します。あなたはこれを行うことができます:
from keras import backend as K
K.set_value(model.layers[1].states[0], hidden_states)
K.set_value(model.layers[1].states[1], cell_states)
状態は、を使用して設定することもできます
model.layers[1].states[0] = hidden_states
model.layers[1].states[1] = cell_states
しかし、このようにしたとき、RNNをステップ実行した後でも、状態値は一定のままでした。
私はこのアプローチを使用し、完全にうまくいきました:
lstm_cell = LSTM(cell_num、return_state = True)
出力、h、c = lstm_cell(入力、initial_state = [h_prev、c_prev])