在構建基于 vgg16 的分類器之后。我想構建一個邊界框來系結檢測到的物件。
我發現我可以通過在最后一個之后洗掉圖層Maxpool并添加一些來做到這一點fully connected layer
flatten = vgg16.output
flatten = Flatten()(flatten)
bboxhead = Dense(128,activation="relu")(flatten)
bboxhead = Dense(64,activation="relu")(bboxhead)
bboxhead = Dense(32,activation="relu")(bboxhead)
bboxhead = Dense(4,activation="relu")(bboxhead)
box_model = Model(inputs = vgg16.input,outputs = bboxhead)
box_model.summary()
模型應該是這樣的,和我搜的一樣。
Model: "box_model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 224, 224, 3)] 0
block1_conv1 (Conv2D) (None, 224, 224, 64) 1792
block1_conv2 (Conv2D) (None, 224, 224, 64) 36928
block1_pool (MaxPooling2D) (None, 112, 112, 64) 0
block2_conv1 (Conv2D) (None, 112, 112, 128) 73856
block2_conv2 (Conv2D) (None, 112, 112, 128) 147584
block2_pool (MaxPooling2D) (None, 56, 56, 128) 0
block3_conv1 (Conv2D) (None, 56, 56, 256) 295168
block3_conv2 (Conv2D) (None, 56, 56, 256) 590080
block3_conv3 (Conv2D) (None, 56, 56, 256) 590080
block3_pool (MaxPooling2D) (None, 28, 28, 256) 0
block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160
block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808
block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808
block4_pool (MaxPooling2D) (None, 14, 14, 512) 0
block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808
block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808
block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808
block5_pool (MaxPooling2D) (None, 7, 7, 512) 0
flatten (Flatten) (None, 25088) 0
dense (Dense) (None, 128) 3211392
dense_1 (Dense) (None, 64) 8256
dense_2 (Dense) (None, 32) 2080
dense_3 (Dense) (None, 4) 132
=================================================================
Total params: 17,936,548
Trainable params: 3,221,860
Non-trainable params: 14,714,688
_________________________________________________________________
然后訓練模型
from tensorflow.keras.optimizers import Adam
opt = Adam(1e-4)
box_model.compile(loss='mse',optimizer=opt)
steps, val_steps = train_gen.n/batch_size, val_gen.n/batch_size
num_epochs = 30
history = box_model.fit(train_gen,validation_data=val_gen,batch_size=32,epochs=30,verbose=1)
但是我發現最后Dense一層有4個dim,與我的班級數(5)不符。在我將 dim 更改為 5 之后。它有效,但我無法訓練任何東西。輸出 5 值陣列不合理(全 0)。
還是我的實作不正確?
uj5u.com熱心網友回復:
簡而言之:您的實施很好,但您的資料是錯誤的。
為了訓練新的輸出,您需要新的標簽。輸入不需要改變,但你需要以某種方式獲取你試圖檢測的邊界框的 x、y、高度和寬度。如果資料集沒有提供這一點,您需要自己標記它們。
如果你想訓練邊界框坐標,你的標簽需要是邊界框坐標。您無法繼續使用資料集的類標簽進行訓練。無論您的模型試圖在監督學習中學習什么,這都是您需要提供的標簽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399428.html
