2016-12-02 5 views
1

Kerano(私のバックエンドとしてTheanoを使用しています)を私がむしろ新しいものにすることについての質問があります。私は複数のRNN(入力として時系列をとり、出力として1つの数値を計算する)を最初のレイヤーセットとして使用しています。これまでは、反復レイヤIOを使用しているKerasでは、これは簡単です。私は悩みを抱えているのはここケラス:レイヤーの後に計算を追加してモデルを訓練する方法は?

は次のとおりです。

今、私は別の関数(このFを呼び出すことができます)にこのRNN(1ナンバー)の出力を渡し、それをいくつかの計算をしたいです。

私がしたいのは、この計算された出力を(関数fの後に)取り出し、期待される出力に対して(mseのようないくつかの損失を介して)訓練することです。

私は関数fからの出力後の計算をどのようにフィードし、まだKerasのmodel.fitの機能を使ってそれを訓練するのかに関するアドバイスをしたいと思います。次のように

私の擬似コードは次のとおりです。

上記で
X = input 
    Y = output 

    #RNN layer 
    model.add(LSTM(....)) 
    model.add(Activation(...))  %%Returns W*X 

    #function f %%Returns f(W*X) 
    (Needs to take in output from final RNN layer to generate a new number) 

    model.fit(X,Y,....) 

、私はそれがRNNにおける重みのための訓練である一方、関数fからの出力を含めるようにコードを記述するかどうかはわかりません(つまり、列車のF (W * x)をYに対して)。

ご協力いただきありがとうございます。

答えて

0

最も簡単な方法は、正確な計算を行うレイヤーをモデルに追加することです。あなたのコメントから、あなたはちょうど f(W * X)がほしいと思っています。そしてそれはまさに密集層がバイアス項を引いたものです。

私は適切な活性化機能を備えた高密度層を追加することが、あなたが必要とするすべてのものだと考えています。出力でアクティベーションをする必要がない場合は、アクティベーションとして「線形」を使用してください。

関数fは、keras.backendのメソッドを使ってシンボリック関数として指定する必要があり、微分可能な関数でなければならないことに注意してください。

1

あなたの質問から、RNNの重みがfのトレーニングで更新されるかどうかは不明です。

第一オプション - 彼らべき

マティアスが言ったように - シンプルな緻密層は、あなたが探しているものはおそらくです: - 彼らはすべきではない

X = input 
Y = output 

#RNN layer 
model.add(LSTM(....)) 
model.add(Activation(...))  %%Returns W*X 
model.add(Dense(...)) 
model.fit(X,Y,....) 

オプション2あなたのf関数は依然として密なレイヤーですが、反復的にfとRNNを訓練します。

新モデルFを定義し、あなたは上記のように定義rnn_modelを持っていると仮定すると:

X = input 
Y = output 

#RNN layer 
rnn_model = Sequential() 
rnn_model .add(LSTM(....)) 
rnn_model .add(Activation(...))  %%Returns W*X 

f_model = Sequential() 
f_model.add(rnn_model) 
f_model.add(Dense(...)) 

今、あなたは行って、それらを個別に訓練することができます:

# Code to train rnn_model 
rnn_model.trainable = False 
# Code to train f_model 
rnn_model.trainable = True 
関連する問題