Kerasメモ(seq2seqで文字レベル機械翻訳)その2
前回のモデル。
one-hot表現の入力テキストをEncoderに渡し、モデルの隠れ状態(h)および記憶セル(c)をDecoderのインプットとした。
ここで、入力テキストは順方向でEncoderに渡している。
今回、入力テキストを逆方向にしたものをEncoderに渡し、その出力をDecoderのインプットとして追加してみる。
Bidirectionalレイヤを使おうとしたが、
encoder = Bidirectional(LSTM(units=256, return_state=True), merge_mode='concat')
以下のソース箇所でエラー。
tensorflow/python/keras/_impl/keras/layers/wrappers.py
class Bidirectional(Wrapper): .... def call(self, inputs, training=None, mask=None): ... y = self.forward_layer.call(inputs, **kwargs) # y is list, not tensor ... if self.merge_mode == 'concat': output = K.concatenate([y, y_rev]) # y.get_shape() --> Error ...
Encoder用のLSTMレイヤを2つ用意し、出力をconcatenateレイヤで結合する。
encoder_fwd = LSTM(units=256, return_state=True) encoder_bwd = LSTM(units=256, return_state=True, go_backwards=True)
「epochs」を「50」に設定し、トレーニングを終えたモデルを使ったdecode結果。
Input sentence: Go. Decoded sentence: 行け。 - Input sentence: Hi. Decoded sentence: やっほー。 - ... - Input sentence: She is mad at me. Decoded sentence: 彼女は僕をついている。 - Input sentence: She is obstinate. Decoded sentence: 彼女はタイピストです。 - Input sentence: She is on a diet. Decoded sentence: 彼女はダイエット中だ。 - ...
"She is on a diet."という文は、"彼女はダイエットをしている。"という教師データを与えたが、今回、"彼女はダイエット中だ。"としてdecodeされた。
意味レベル、品詞レベルでも妥当。
一方、今回は文字レベルの機械翻訳なので、品詞レベルでおかしな結果もあった。
Input sentence: She kept working. Decoded sentence: 彼女は歌を歌がめた。
トレーニング時のlossとaccuracyの遷移は以下のとおり。