質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

keras Seq2seq: TimeDistributed()を使って各タイムステップにCustomLayerを付加した時のテンソルサイズエラー

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 596

初投稿です。
kerasを用いたseq2seqモデルへのAttentionの実装を行なっています。
下記のコードのmyModel()内のようにTimeDistributed()を使ってdecoderの各タイムステップにCustomLayerを付加する形で実装を試みたところ学習時に次のような形でエラーが出ました(一部抜粋)。

※batch_size=200, encoderのタイムステップ長=118, decoderのタイムステップ長=8, 隠れ状態ベクトルの次元数=300

Train on 50272 samples, validate on 5586 samples
Epoch 1/300
2019-04-11 17:53:00.020675: W tensorflow/core/framework/op_kernel.cc:1192] Invalid argument: Incompatible shapes: [1600,118,300] vs. [200,118,300]


エラー発生箇所はMyLayer()のcall()内です。
[1600,118,300]に注目してほしいのですが、CustomLayerへの入力x(dec)でバッチサイズ次元がbatch_size(200)* decoderのタイムステップ長(8)に変更されてしまっているようで、その後の演算を行う際にエラーが出ているようです。TimeDistributed()がうまく機能していないように思えるのですが原因等ご教授ください。

import keras
from keras.models import Model
from keras.layers import Dense,Lambda
from keras.engine.topology import Input
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM,GRU,SimpleRNN
from keras.layers.wrappers import TimeDistributed

from keras import backend as K
from keras.engine.topology import Layer

class MyLayer(Layer):

    def __init__(self, encoder=None,input_length=1,**kwargs):
        self.output_dim = 300
        self.encoder=encoder
        self.input_length=input_length
        super().__init__(**kwargs)

    def build(self,input_shape):

        self.WA = self.add_weight(name='wa',
                                 shape=(300, 600),
                                 initializer='uniform',
                                 trainable=True)

    def call(self,x):
        enc = self.encoder #(batchsize,118,300)
        dec = x #(batchsize,300) 学習時に(batchsize*8,300)になってしまう。
        WA = self.WA
        IL = self.input_length

        dec_norm = K.repeat(dec,IL) #(batchsize,118,300)

        omega =  dec_norm * enc #(batchsize,118,300)*(batchsize,118,300)=(batchsize,118,300)
        omega_sum = K.sum(omega,axis=2)  #(batchsize,118)

        a = K.softmax(omega_sum)
        a = K.expand_dims(a,axis=-1)
        a = K.repeat_elements(a,300,axis=-1) #(batchsize,118,300)

        h_bar = K.sum(a*enc, axis=1) #(batchsize,118,300)*(batchsize,118,300)=(batchsize,118,300) =>(batchsize,300)

        vecs = K.concatenate([h_bar,dec]) #(batchsize,600)
        vecs = K.reshape(vecs, (-1,600,1)) #(batchsize,600,1)

        output = K.tanh(K.dot(WA,vecs))
        output = K.permute_dimensions(output,(1,0,2))
        output = K.reshape(output,(-1,300)) #(batch_size,300)

        return output

LATENT_DIM=300
INPUT_VOCAB_SIZE=5000


def myModel(len_input):

  #encoder
    encoder_inputs = Input(shape=(None,))
    encoder_embedding = Embedding(INPUT_VOCAB_SIZE, 500, name='enc_emb')(encoder_inputs)
    encoder = GRU(LATENT_DIM, return_sequences=True, return_state=True, name='encoder')
    encoder_outputs, encoder_states = encoder(encoder_embedding)

    #decoder
    decoder_inputs = Input(shape=(None,))
    decoder_embedding = Embedding(39, 100, name='dec_emb')(decoder_inputs)
    decoder = GRU(LATENT_DIM, return_sequences=True, return_state=True, name='decoder')
    decoder_outputs, _ = decoder(decoder_embedding, initial_state=encoder_states)

    #custom_layer
    attention = MyLayer(encoder=encoder_outputs, input_length=len_input) 
    att = TimeDistributed(attention)(decoder_outputs) 

    decoder_dense = Dense(39, activation='softmax', name='dec_dense')
    decoder_final_outputs = decoder_dense(att)

    model = Model([encoder_inputs, decoder_inputs], decoder_final_outputs)

    return model


def main():

    model = myModel(len_input) #len_input encoderのタイムステップ長118

    model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
    model.summary()

    history = model.fit([x_train, y_train_input],y_train_output, batch_size=200, nb_epoch=300,validation_split=0.1)


if __name__ == '__main__':
    main()

参考 エラーメッセージ全貼り

Train on 50272 samples, validate on 5586 samples
Epoch 1/300
2019-04-11 17:53:00.020675: W tensorflow/core/framework/op_kernel.cc:1192] Invalid argument: Incompatible shapes: [1600,118,300] vs. [200,118,300]
     [[Node: time_distributed_1/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](time_distributed_1/Tile, encoder/transpose_1)]]
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1323, in _do_call
    return fn(*args)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1302, in _run_fn
    status, run_metadata)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/errors_impl.py", line 473, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [1600,118,300] vs. [200,118,300]
     [[Node: time_distributed_1/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](time_distributed_1/Tile, encoder/transpose_1)]]
     [[Node: loss/mul/_77 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_4737_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "attention0411.py", line 250, in <module>
    main()
  File "attention0411.py", line 246, in main
    history = model.fit([x_train, y_train_input],y_train_output, batch_size=200, nb_epoch=300,validation_split=0.1)
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/training.py", line 1598, in fit
    validation_steps=validation_steps)
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/training.py", line 1183, in _fit_loop
    outs = f(ins_batch)
  File "/usr/local/lib/python3.5/dist-packages/keras/backend/tensorflow_backend.py", line 2273, in __call__
    **self.session_kwargs)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 889, in run
    run_metadata_ptr)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1120, in _run
    feed_dict_tensor, options, run_metadata)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1317, in _do_run
    options, run_metadata)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 1336, in _do_call
    raise type(e)(node_def, op, message)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [1600,118,300] vs. [200,118,300]
     [[Node: time_distributed_1/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](time_distributed_1/Tile, encoder/transpose_1)]]
     [[Node: loss/mul/_77 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_4737_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Caused by op 'time_distributed_1/mul', defined at:
  File "attention0411.py", line 250, in <module>
    main()
  File "attention0411.py", line 241, in main
    model = myModel(max_word_len_input)
  File "attention0411.py", line 214, in myModel
    att=TimeDistributed(attention)(decoder_outputs)
  File "/usr/local/lib/python3.5/dist-packages/keras/engine/topology.py", line 602, in __call__
    output = self.call(inputs, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/keras/layers/wrappers.py", line 203, in call
    y = self.layer.call(inputs, **kwargs)
  File "attention0411.py", line 165, in call
    omega =  dec_norm * enc #(batchsize,118,300)*(batchsize,118,300)=(batchsize,118,300)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/math_ops.py", line 894, in binary_op_wrapper
    return func(x, y, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/math_ops.py", line 1117, in _mul_dispatch
    return gen_math_ops._mul(x, y, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 2726, in _mul
    "Mul", x=x, y=y, name=name)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/op_def_library.py", line 787, in _apply_op_helper
    op_def=op_def)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 2956, in create_op
    op_def=op_def)
  File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/ops.py", line 1470, in __init__
    self._traceback = self._graph._extract_stack()  # pylint: disable=protected-access

InvalidArgumentError (see above for traceback): Incompatible shapes: [1600,118,300] vs. [200,118,300]
     [[Node: time_distributed_1/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](time_distributed_1/Tile, encoder/transpose_1)]]
     [[Node: loss/mul/_77 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_4737_loss/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Kerasに関する質問
  • keras Seq2seq: TimeDistributed()を使って各タイムステップにCustomLayerを付加した時のテンソルサイズエラー