我一直在試驗 MIDV 500 資料集的一部分,試圖定位檔案四邊形。所以,我的輸出是一個 8 個浮點數的向量。
RGB 影像被縮放到 960 x 540 像素(960、540、3),像素值被縮放到 [0..1]。目標向量也縮放到 [0..1](簡單地除以影像暗淡)
我的第一種方法是從 Keras 應用程式(嘗試過 EfficientNetB0-2)中預訓練 CNN( 微調),并使用以下 Dense 頭:
effnet = EfficientNetB0(weights="imagenet", include_top=False, input_shape=(540, 960, 3))
# effnet.trainable = False
for layer in effnet.layers:
if 'block7a' not in layer.name and 'top' not in layer.name:
layer.trainable = False
model = Sequential()
model.add(Flatten())
model.add(Dense(128, activation="relu"))
model.add(Dropout(0.3))
model.add(Dense(64, activation="relu"))
model.add(Dropout(0.3))
model.add(Dense(32, activation="relu"))
model.add(Dropout(0.3))
model.add(Dense(8, activation='sigmoid'))
opt = Nadam(learning_rate=0.001)
model.compile(metrics=[iou_metric], loss=iou_loss, optimizer=opt)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.6, patience=10)
early_stopping = EarlyStopping(monitor='val_loss', patience=25)
添加了一些回呼,使用 Nadam 作為優化器,使用 Jaccard score 作為損失和度量。
損失圖
從損失圖中我們可以看出,訓練損失通過訓練程序減少。雖然,val 損失表現得很奇怪。
大約 30 個 epoch 之后 model.predict() 給出了一組相同的向量([0., 0., 1., 1., 0., 0., 0., 1.] * val_x 的形狀)。我不確定它是過擬合還是欠擬合(雖然似乎是錯誤的方法)。
那么,你能告訴我我做錯了什么嗎?我嘗試了一些不同的損失函式,在縮放到 [0..1] 之前和之后仔細檢查了我的資料。將嘗試像 UNet 之類的分割方法,盡管本地化似乎是正確的。
uj5u.com熱心網友回復:
兩件事情:
- 請檢查您使用的是哪個版本的 TensorFlow (TF)。我相信從 2.5 開始,您不需要將輸入影像重新縮放到 [0-1] 范圍。網路需要 [0-255] 的張量。https://keras.io/api/applications/efficientnet/
- 您的模型架構和回呼看起來不錯(盡管我不是這個優化器 損失的專家)。因此,我假設問題可能來自您的資料輸入。您是否使用 ImageDataGenerator 作為輸入并將資料從訓練和驗證中分離出來?如果沒有,它可能值得一試。您可以指定驗證子集,生成器將為您拆分資料。更多資訊:https ://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image/ImageDataGenerator
uj5u.com熱心網友回復:
血統。最后,一個健康的梯度下降。所以,解決方案:
- 正如@Nicolas Perez de Olaguer 之前提到的,我應該使用未縮放的影像資料(3 個通道縮放到 [0..255] 的常規 RBG 影像)
- 我一直在嘗試解決定位問題,即四邊形回歸,您可以在其中預測四邊形節點坐標(與 bbox 回歸不同,您可以在其中預測 4 的向量)。而且我決定使用現代 IOU 損失(Jaccard 損失),它通常用于 bbox 回歸,并期望向量為 4 作為輸入,盡管我的向量有 8 個元素,并且由于問題細節而損失函式計算不正確。
- 此外,我的模型有一些設計流程值得大家學習。首先,我添加了很多密集層,1 或 2 層就足夠了(更多只會減慢訓練程序)。其次,我選擇了太大的影像解析度,這又只會減慢訓練程序(對于這么大的解析度來說,大的白色四邊形定位是一個過于簡單的問題)。最后,我還沒有考慮 ImageNet 權重,它有時可能會由于高度非典型資料而降低訓練質量(如果你試圖在它從未見過的物件上使用預訓練的 CNN)。
感謝您的關注和幫助。我會將此答案標記為解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/441956.html
上一篇:如何在執行覆寫時驗證欄位和條件?
下一篇:帶有附加引數的自定義指標函式
