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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

2105閲覧

Keras: concatenateに関して

marimory_y

総合スコア5

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/02/02 09:35

前提・実現したいこと

Kerasで自然言語処理を行っています。入力文(input1)をEmbeddingとLSTMで処理したあと、もう一つの入力(input2)とLSTMの出力をconcatenateして次のAttention処理を行いたいです。input1のshapeとinput2のshapeが違ったためrepeatを行うことでshapeを整えたのですが、うまく行かず解決方法が見つかりません。教えていただけると助かります。

発生している問題・エラーメッセージ

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, None, 100), (None, 1, 100)]

該当のソースコード

Keras

1from keras import layers, Input 2import keras.backend as K 3 4#model 5input1 = Input(shape=(None,)) 6x = layers.Embedding(vocab_size, 50, mask_zero=True, trainable=True)(input1) 7x = layers.LSTM(100, return_sequences=True, dropout=0.5, recurrent_dropout=0.1)(x) 8input2 = Input(shape=(100,)) 9y = K.repeat(input2,1) 10concatenated = layers.concatenate([x, y]) 11attn_output = AttentionWithContext()(concatenated)

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

仮に、xのshapeを(None, num1, 100)、yのshapeを(None, num2, 100)とします。
その場合、concatenate([x, y])のデフォルトの動作(すなわちaxis=-1のとき)は、xの100とyの100が結合されて(None, ?, 200)となります(この場合、num1とnum2は同じにしないといけません)。
もし、(None, num1 + num2, 100)としたい場合は、concatenate([x, y], axis=1)(あるいはConcatenate(axis=1)([x, y]))のようにaxisを1か-2にする必要があります。


あと、backendの関数とレイヤーは別物なので、y = K.repeat(input2,1)ではなく、y = Lambda(lambda x: K.repeat(x, 1))(input2)のように、Lambdaレイヤーを使ったほうがよろしいかと思います。

投稿2020/02/02 12:11

fiveHundred

総合スコア9917

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marimory_y

2020/02/03 10:34

エラーに関する処理方法、そしてご助言の方本当にありがとうございます!その部分のエラーに関しては無事解決しました。ただ、その後今度は同じconcatenateの内部でエラーが起きてしました。 ValueError: Dimension 0 in both shapes must be equal, but are 1 and 100. Shapes are [1] and [100]. for 'concatenate_1/concat_1' (op: 'ConcatV2') with input shapes: [?,?,1], [?,1,100], [] and with computed input tensors: input[2] = <1>. (None, None, 100)のshapeだったはずのLSTMの出力が(?, ?, 1)の形に変換されているようなのですが、これは内部で何が行われているのでしょうか?
fiveHundred

2020/02/03 12:18

すみませんが、これは私はよく分かりません。 試してみたところ「concatenated = layers.concatenate([x, y])」を「concatenated = layers.Lambda(lambda x: K.concatenate(x, axis=1))([x, y])」にするとなぜか動作しましたが、それでなぜ上手くいったかは分かりません。
marimory_y

2020/02/06 02:07

ありがとうございます!無事に解決し正常に動作しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問