web-dev-qa-db-ja.com

LSTM非表示状態のTensorflow / Kerasの初期化

誰かがテンソルフローでLSTMの非表示状態を初期化する方法を説明できますか? LSTM反復オートエンコーダーを構築しようとしているので、そのモデルをトレーニングした後、学習した教師なしモデルの非表示状態を教師ありモデルの非表示状態に転送したいと思います。それは現在のAPIでも可能ですか?これは私が再現しようとしている紙です:

http://papers.nips.cc/paper/5949-semi-supervised-sequence-learning.pdf

9
Tommy

はい-これは可能ですが、本当に面倒です。例を見てみましょう。

  1. モデルの定義:

    _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_モードを設定することによって行われます。

  2. これで、初期状態の値を設定できます。

    _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]_はセルの状態を保持します。

お役に立てば幸いです。

12
Marcin Możejko

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をステップ実行した後でも、状態値は一定のままでした。

1
andraugust

私はこのアプローチを使用し、完全にうまくいきました:

lstm_cell = LSTM(cell_num、return_state = True)

出力、h、c = lstm_cell(入力、initial_state = [h_prev、c_prev])

0
Mj88