0

我正在使用CNN開發分類模型,現在我想在我的問題中應用分類算法(Bilinear CNN Models for Fine-grained Visual Recognition Tsung-Yu Lin Aruni RoyChowdhury Subhransu Maji University of Massachusetts, Amherst)。矩陣產品到keras中的兩個模型的輸出

具體來說,現在我想做兩個CNN模型的輸出矩陣的外積,並且我已經完成了矩陣的轉置,現在我只想把兩個矩陣相乘keras,其大小是,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

此外,

  • 由於兩個VGG16車型共享相同的輸入圖像,你可以使用input_tensor參數提供共享輸入。
  • 請注意,VGG16具有固定的圖層名稱。您必須更改其中一個模型的圖層名稱,以防止「所有圖層名稱應該是唯一的」。錯誤。
  • Keras有一個內置的Reshape圖層,這裏不需要使用TF。
  • 使用Dot而不是已棄用的Merge圖層。

回到您的問題,Dot中的參數axes指定哪些軸將被縮小。所以你在應用之前不需要調整張量。

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

真的很有幫助,非常感謝你! –