0

CNNを使用して分類モデルを作成していますが、今では問題の分類アルゴリズムを適用したい(Bilinear CNN Models for Fine-grained Visual Recognition Tsung-Yu Lin Aruni RoyChowdhury Subhransu Maji University of Massachusetts, Amherst)。ケラスの2つのモデルの出力に行列積をかける

具体的には、今、私は2つのCNNモデルの2つの出力マトリックスに外積をしたい、と私は今、私はその大きさである(なし、kerasで2つの行列を乗算したい、行列の転置を終了しました、512、49)および(なし、49,512)。

私はkerasにマージに層を使用しようとするが、多少の誤差が登場:

私は乗算モードを使用する場合、私はドットモード、

ValueError: Dimension incompatibility using dot mode: 49 != 512. Layer shapes: (None, 512, 49), (None, 49, 512)

を使用する場合は、

ValueError: Only layers of same output shape can be merged using mul mode. Layer shapes: [(None, 512, 49), (None, 49, 512)]

私はそれを解決する方法がわからない、助けてください私!ここに私の問題のいくつかのコードされている:あなたのモデルが連続していないときに、すべての

t_model = applications.VGG16(weights='imagenet', include_top=False, 
           input_shape=(224, 224, 3)) 
model_a = Sequential() 
model_a.add(t_model) 
def trans_1(conv): 
    conv = tf.reshape(conv, [-1, 49, 512]) 
    return conv 
model_a.add(Lambda(trans_1, output_shape=[49, 512])) 

s_model = applications.VGG16(weights='imagenet', include_top=False, 
           input_shape=(224, 224, 3)) 
model_b = Sequential() 
model_b.add(s_model) 
def trans_2(conv): 
    conv = tf.reshape(conv, [-1, 49, 512]) 
    conv = tf.transpose(conv, perm = [0, 2, 1]) 
    return conv 
model_b.add(Lambda(trans_2, output_shape=[512, 49])) 

f_model = Sequential() 
f_model.add(Merge([model_b, model_a], mode='dot')) 

答えて

1

まず、Sequential()を使用しないでください。代わりにfunctional APIを使用してください。

また、

  • 2つのVGG16モデルは同じ入力画像を共有するので、あなたは共有入力を提供するために、input_tensor引数を使用することができます。
  • VGG16にはレイヤ名が固定されていることに注意してください。 「すべてのレイヤー名は一意にする必要があります」を防ぐため、モデルの1つのレイヤー名を変更する必要があります。エラー。
  • KerasにはReshape層が組み込まれているため、ここでTFを使用する必要はありません。
  • 推奨されないMerge層の代わりにDotを使用してください。

質問に戻ると、Dotaxes引数は、どの軸が縮小されるかを指定します。テンソルを適用する前にテンソルを転置する必要はありません。

input_tensor = Input(shape=(224, 224, 3)) 
t_model = applications.VGG16(weights='imagenet', include_top=False, input_tensor=input_tensor) 
t_output = Reshape((49, 512))(t_model.output) 
s_model = applications.VGG16(weights='imagenet', include_top=False, input_tensor=input_tensor) 
for layer in s_model.layers: 
    layer.name += '_1' 
s_output = Reshape((49, 512))(s_model.output) 
merged = Dot(axes=1)([s_output, t_output]) 
+0

本当にありがとう、本当にありがとう! –

関連する問題