1. ホーム
  2. python

[解決済み] kerasで2つのレイヤーを連結する方法は?

2022-10-13 17:37:19

質問

2つの層を持つニューラルネットワークの例を持っています。最初の層は2つの引数を取り、1つの出力を持つ。2番目の層は、最初の層の結果として1つの引数と1つの追加の引数を取る必要があります。このようになります。

x1  x2  x3
 \  /   /
  y1   /
   \  /
    y2

そこで、2つのレイヤーを持つモデルを作成し、それらをマージしようとしたのですが、エラーが返されます。 The first layer in a Sequential model must get an "input_shape" or "batch_input_shape" argument. というエラーが返ってきました。 result.add(merged) .

モデルです。

first = Sequential()
first.add(Dense(1, input_shape=(2,), activation='sigmoid'))

second = Sequential()
second.add(Dense(1, input_shape=(1,), activation='sigmoid'))

result = Sequential()
merged = Concatenate([first, second])
ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)
result.add(merged)
result.compile(optimizer=ada_grad, loss=_loss_tensor, metrics=['accuracy'])

どのように解決するのですか?

エラーが発生した理由は result として定義されているためです。 Sequential() は単なるモデルのコンテナであり、それに対する入力は定義されていません。

を構築しようとしていることを考えると、セット result をセットして、3番目の入力である x3 .

first = Sequential()
first.add(Dense(1, input_shape=(2,), activation='sigmoid'))

second = Sequential()
second.add(Dense(1, input_shape=(1,), activation='sigmoid'))

third = Sequential()
# of course you must provide the input to result which will be your x3
third.add(Dense(1, input_shape=(1,), activation='sigmoid'))

# lets say you add a few more layers to first and second.
# concatenate them
merged = Concatenate([first, second])

# then concatenate the two outputs

result = Concatenate([merged,  third])

ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)

result.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

しかし、このような入力構造を持つモデルを構築するために私が推奨する方法は、以下のように 機能API .

ここでは、要件に沿った実装を紹介します。

from keras.models import Model
from keras.layers import Concatenate, Dense, LSTM, Input, concatenate
from keras.optimizers import Adagrad

first_input = Input(shape=(2, ))
first_dense = Dense(1, )(first_input)

second_input = Input(shape=(2, ))
second_dense = Dense(1, )(second_input)

merge_one = concatenate([first_dense, second_dense])

third_input = Input(shape=(1, ))
merge_two = concatenate([merge_one, third_input])

model = Model(inputs=[first_input, second_input, third_input], outputs=merge_two)
ada_grad = Adagrad(lr=0.1, epsilon=1e-08, decay=0.0)
model.compile(optimizer=ada_grad, loss='binary_crossentropy',
               metrics=['accuracy'])

コメントで質問に答えること。

  1. result と merged はどのように接続されるのですか? どのように連結されるのかを意味していると仮定して。

連結はこのように動作します。

  a        b         c
a b c   g h i    a b c g h i
d e f   j k l    d e f j k l

つまり、行は単に結合されているだけです。

  1. では x1 が最初に入力されます。 x2 は2番目に入力され x3 は3番目に入力されます。