[英]How to insert dropout layers after activation layers in a pre-trained non-sequential model using functional keras API?
[英]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.