簡體   English   中英

如何將頂層添加到預先訓練的功能模型中

[英]How to add top layers to a pre-trained functional model

我正在嘗試使用Keras創建一個ResNet50模型來預測貓與狗。 我決定只使用1000點的數據子集,進行700-150-150列車驗證測試。 (我知道它很小,但它是我的電腦可以處理的。)我已經使用了導入模型

resnet_model = keras.applications.ResNet50(include_top=False, input_tensor=None, input_shape=None, pooling=None, classes=2)
resnet_model.compile(Adam(lr=.0001), loss='categorical_crossentropy', metrics=['accuracy'])

但是,當我試圖適應它

aug = ImageDataGenerator(rotation_range=20, zoom_range=0.15,
  width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,
  horizontal_flip=True, fill_mode="nearest")

resnet_model.fit_generator(aug.flow(X_train, y_train, batch_size = batches), steps_per_epoch = len(X_train) // batches,
                          validation_data = (X_valid, y_valid), validation_steps = 4, epochs = 10, verbose = 1)

我收到以下值錯誤:

ValueError:檢查目標時出錯:預期activation_352有4個維度,但得到的數組有形狀(150,2)

(150,2)數組顯然來自valid_y ,但我不知道為什么特定輸出應該有4個維度 - 應該是標簽向量,而不是4維圖像大小和顏色向量。 有人可以幫我解決如何讓模型識別這個輸入嗎?

注意:我知道DanielMöller 在這里提到我需要添加一個Flatten()圖層,但功能模型及其調用的本質似乎很難實現,除非我想從頭開始重寫整個ResNet(看起來似乎打敗擁有可重復使用的預訓練模型的目的)。 任何見解將不勝感激。

審查后默勒的意見和宇陽代碼在這里 ,我能夠重新制訂使用下面的代碼模型的頂部:

pre_resnet_model = keras.applications.ResNet50(include_top=False, weights='imagenet', input_tensor=None, input_shape=(224,224,3), pooling=None, classes=2)
for layer in pre_resnet_model.layers:
    layer.trainable = False
flatten = Flatten()(pre_resnet_model.output)   
output = Dense(2, activation='softmax')(flatten)
resnet_model = Model(pre_resnet_model.input, output)

flatten層變平,然后output層利用它。 我還不確定為什么Model()只需要一個ResNet50().input和一個output ,所以如果有人可以向我解釋為什么我跳過Flatten() ,我會很感激它 - Model()顯然沒有不需要列出所有圖層,所以它只是輸入和輸出嗎? 我會看看文檔,但與此同時,如果有人徘徊並有明確的解釋,我會接受它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM