2017-08-11 19 views
3

私はアテンション機構の実装をYang et al.で使いたいと思う。私はこの注目のmachanismを使用してカスタムレイヤーの作業実装を見つけたhere。代わりに、私のLSTMの出力値を使用する:ケラスのLSTMのアウトプットの代わりに隠れた状態を使う

my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True) 
my_lstm = AttentionWithContext()(my_lstm) 
out = Dense(2, activation='softmax')(my_lstm) 

私はLSTMの隠れ状態を使用したい:

my_lstm = LSTM(128, input_shape=(a, b), return_state=True) 
my_lstm = AttentionWithContext()(my_lstm) 
out = Dense(2, activation='softmax')(my_lstm) 

しかし、私はエラーを取得:

TypeError: can only concatenate tuple (not "int") to tuple

Iをreturn_sequencesと組み合わせて試しましたが、私が試したことはこれまでに失敗しました。返される出力シーケンスのように使用するために、返すテンソルをどのように変更できますか?

ありがとうございます!

+1

'return_state = True'は最後の非表示状態のみを返し、すべての非表示状態を返しません。だから、もしあなたが 'return_state = True'のときにテンソルのリストを扱うようにAttentionWithContextを編集したとしても、あなたが望むものとは思えません。 –

+0

@NicoleWhiteそれは問題になるでしょう。私はそれが最後の隠れた状態を返すだけの理由を見ませんが、それはそうです。私は疑問に思っている:ほとんどの論文では、彼らは隠された状態について話す。これは本当に意味ですか、間違った用語を使用していますか?出力状態の代わりに隠し状態を使用する理由はありませんが、それらのメソッドを正しく使用したいのです。 – V1nc3nt

+0

出力状態とは何を言いますか? –

答えて

1

あなたの混乱は、おそらくKerasのドキュメントが少し不明であることに起因すると思います。彼らは非表示の状態が出力異なっているが、彼らは同じでは1であることを意味するものであるため

return_sequences: Boolean. Whether to return the last output in the output sequence, or the full sequence. 
return_state: Boolean. Whether to return the last state in addition to the output. 

return_state上のドキュメントは特に混乱しています。 LSTMの場合、隠された(出力)状態に加えて、セル状態があるので、これは少し怪しいです。私たちは、KerasコードでLSTMステップ関数を見て、これを確認することができます

class LSTM(Recurrent): 
    def step(...): 
     ... 
     return h, [h, c] 

このステップ関数の戻り値の型がoutput, statesです。隠しステートhは実際には出力であり、ステートでは非表示ステートhとセルステートcの両方を取得していることがわかります。このため、「隠された」と「出力する」という言葉を同じ意味で使用してリンクしたWiki articleが表示されます。

あなたが少し近くにリンクした紙を見ると、あなたの元の実装はあなたが望むものです。

my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True) 
my_lstm = AttentionWithContext()(my_lstm) 
out = Dense(2, activation='softmax')(my_lstm) 

これは、各タイムステップで非表示の状態をあなたのアテンションレイヤに渡します。あなたが運が悪いという唯一のシナリオは、各タイムステップから自分のアテンションレイヤー(私が最初に思ったものです)にセル状態を実際に渡したいものですが、これはあなたが望むものではないと思います。実際にリンクしているペーパーは、セル状態の概念を持たないGRUレイヤーを使用し、ステップ関数も出力として隠れ状態を返します。

class GRU(Recurrent): 
    def step(...): 
     ... 
     return h, [h] 

したがって、この論文では、セル状態ではなく、隠れ状態(出力ともいう)についてはほぼ確実に言及しています。

+0

私はこのペーパーをもう一度読んで、GRUを使用していることにも気づいた。私は彼らが細胞状態を使用していないことを知るのに十分に精通していなかった。私は紙の中のGRUの細胞状態を意味していると思っていたので、私は実際に私の注意層のLSTMの細胞状態を得たいと思っていました。今私は、GRUとYangらに細胞状態がないことを知っています。出力(または隠れたベクトル)を意味するだけです。あなたの時間と助けをありがとう、ありがとう! – V1nc3nt

+0

@ニコールホワイト、説明をありがとう。あなたの解決策では、隠れた状態(つまり出力)をファイルに書き込むのではなく、書き込む方法がありますか? – Mohammadreza

関連する問題