ichou1のブログ

主に音声認識、時々、データ分析のことを書く

Kerasメモ(seq2seqで文字レベル機械翻訳)その2

前回のモデル。

f:id:ichou1:20190210092043p:plain
f:id:ichou1:20190210091920p:plain

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)

f:id:ichou1:20190210092729p:plain

「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の遷移は以下のとおり。
f:id:ichou1:20190210105216p:plain
f:id:ichou1:20190210105231p:plain