同じ次元の2つの別々の行列(たとえば、グレースケール画像)を入力として受け取り、-1から1の間の値(おそらくtanh)を出力するニューラルネットワークを2つ構築したいと思います。
入力として2つの別々の畳み込み層が存在するようにネットワークを構築したいと思います。それぞれが1つの行列(または画像)を取ります。次に、これらは次のレイヤーで結合されます。だから私はそれをそのように見せたい:
私の最初の質問は、これをkerasで(またはテンソルフローではない場合)実行できますか?2番目の質問は?それは意味がありますか?また、2つの行列を非常に簡単に合成でき、1つのconv2dレイヤーのみを使用できるためです。だからこのようなもの:
私が正確にやりたいことは行き過ぎでしょう。しかし、最初のバージョンの方が理にかなっている状況を想像できますか?
Kerasでそれを行うことができ、入力が異なる場合は理にかなっています。ケラスでこれを行うには、最初に複数の入力モデルが必要であり、畳み込み層の出力を連結する必要があります。
input_1= Input(shape=(x,y), name='input_1')
input_2= Input(shape=(x,y), name='input_1')
c1 = Conv2D(filter_size, kernel_size))(input_1)
p1 = MaxPooling2D(pool_size=(2, 2)(input_1)
f1 = Flatten()(p1)
c2 = Conv2D(filter_size, kernel_size))(input_2)
p2 = MaxPooling2D(pool_size=(2, 2)(c2)
f2 = Flatten()(p2)
x = concatenate([f1, f2])
x = Dense(num_classes, activation='sigmoid')(x)
model = Model(inputs=[input_1, input_2], outputs=[x])
model.compile('adam', 'binary_crossentropy', metrics=['accuracy'])
データによっては、畳み込みレイヤーを共有することも可能であるため、demを一度定義して再利用するだけで済みます。この場合、重みは共有されます。
conv = Conv2D(filter_size, kernel_size))
pooling = MaxPooling2D(pool_size=(2, 2)
flatten = Flatten()
f1 = flatten(pooling(conv(input_1)))
f2 = flatten(pooling(conv(input_2)))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加