簡體   English   中英

遷移學習 - 將我的頂層與預訓練模型合並,將准確率降至 0%

[英]Transfer Learning - Merging my top layers with pretrained model drops accuracy to 0%

我的目標是將我的頂層附加到像 VGG19 這樣的預訓練模型,並使用合並模型進行一些預測。 合並后的模型精度為 0。 需要一點幫助。

我自己的頂層

from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential

vgg19top_model = Sequential()
vgg19top_model.add(GlobalAveragePooling2D(input_shape=train_vgg19.shape[1:]))  # shape=(7, 7, 512)
vgg19top_model.add(Dense(255, activation='relu'))
vgg19top_model.add(Dropout(0.35))
vgg19top_model.add(Dense(133, activation='softmax'))
vgg19top_model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
global_average_pooling2d_1 ( (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 255)               130815    
_________________________________________________________________
dropout_1 (Dropout)          (None, 255)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 133)               34048     
=================================================================
Total params: 164,863
Trainable params: 164,863
Non-trainable params: 0

在瓶頸特征上訓練我的頂級模型並獲得了 72% 的准確率

在這里重新加載這些重量
代碼未顯示

加載 VGG19 底層以與我的頂層合並

from keras import applications
vgg19=applications.vgg19.VGG19(include_top=False, weights='imagenet',input_shape=(224, 224, 3))
vgg19.summary()

Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
...
...
_________________________________________________________________
block5_conv4 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
=================================================================
Total params: 20,024,384
Trainable params: 20,024,384
Non-trainable params: 0

合並兩個模型

from keras.layers import Input, Dense
from keras.models import Model

global_average_pooling2d_7 = vgg19.get_layer('block5_pool')  # shape=(?, 7, 7, 512)
bn_conv1_model = Model(inputs=vgg19.input, outputs=global_average_pooling2d_7.output)

new_model = Sequential()
new_model.add(bn_conv1_model)
new_model.add(vgg19top_model)
new_model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
model_12 (Model) <-VGG19     (None, 7, 7, 512)         20024384  
_________________________________________________________________
sequential_6 (Sequential)    (None, 133)               164863    
=================================================================
Total params: 20,189,247
Trainable params: 164,863
Non-trainable params: 20,024,384

現在讓我們在一些預測上端到端地測試合並的模型

它以 0% 的准確率完全失敗

我該如何端到端地測試這個新模型——或者更確切地說,為什么它的預測如此糟糕?

我認為,從你的做法來看,你堆疊了兩個 VGG19 模型,但第一個只是 VGG19 的一些層。

這不是提高准確性的最佳方法。 首先,它只會增加網絡的參數,因為您按順序組合模型,計算量會很大。 其次,它不會提高准確率,因為第一個模型將采用低層和高層的特征,但是接下來的 CNN 層從第二個模型中提取了更多無關緊要的復雜特征。

您可能想嘗試另一種方法,如 Siamese CNN 或雙向 CNN (BCNN)。 這個想法是我們將訓練集提供給兩個 CNN 模型,然后我們合並這兩個 CNN 的輸出。 證明該方法可以提取輸入圖像的特征變量。

你可以訪問這個網站了解更多關於 BCNN 的信息http://vis-www.cs.umass.edu/bcnn/

暫無
暫無

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

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