簡體   English   中英

我的 CNN 圖像識別模型產生波動的驗證損失

[英]My CNN image recognition model produces fluctuating validation loss

我的模型在驗證損失方面經歷了劇烈而大的波動,並且沒有收斂。

我正在用我的三只狗做一個圖像識別項目,即對圖像中的狗進行分類。 兩只狗非常相似,第三只非常不同。 我分別為每只狗拍攝了 10 分鍾的視頻。 每秒將幀提取為圖像。 我的數據集包含大約 1800 張照片,每只狗 600 張。

此代碼塊負責擴充和創建數據以提供給模型。

randomize = np.arange(len(imArr)) # imArr is the numpy array of all the images
np.random.shuffle(randomize) # Shuffle the images and labels
imArr = imArr[randomize]
imLab= imLab[randomize] # imLab is the array of labels of the images
lab = to_categorical(imLab, 3)

gen = ImageDataGenerator(zoom_range = 0.2,horizontal_flip = True , vertical_flip = True,validation_split = 0.25)
train_gen = gen.flow(imArr,lab,batch_size = 64, subset = 'training')
test_gen = gen.flow(imArr,lab,batch_size =64,subset = 'validation')

這張圖片是下面模型的結果。 在此處輸入圖片說明

model = Sequential()

model.add(Conv2D(16, (11, 11),strides = 1, input_shape=(imgSize,imgSize,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides = 2))
model.add(BatchNormalization(axis=-1))


model.add(Conv2D(32, (5, 5),strides = 1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides = 2))
model.add(BatchNormalization(axis=-1))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides = 2))
model.add(BatchNormalization(axis=-1))


model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(BatchNormalization(axis=-1))
model.add(Dropout(0.3))




#Fully connected layer
model.add(Dense(256))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dropout(0.3))

model.add(Dense(3))

model.add(Activation('softmax'))

sgd = SGD(lr=0.004)
model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])

batch_size = 64
epochs = 100
model.fit_generator(train_gen, steps_per_epoch=(len(train_gen)), epochs=epochs, validation_data=test_gen, validation_steps=len(test_gen),shuffle = True)

我嘗試過的事情。

  • 高/低學習率 (0.01 -> 0.0001)
  • 在兩個 Dense 層中將 Dropout 增加到 0.5
  • 增加/減少兩個密集層的大小(128 分鍾 -> 4048 最大)
  • 增加 CNN 層數
  • 引入動力
  • 增加/減少批次大小

我沒有嘗試過的事情

  • 我沒有使用任何其他損失或指標
  • 我沒有使用任何其他優化器。
  • 沒有調整CNN層的任何參數

我的模型中似乎存在某種形式的隨機性或太多參數。 我知道它目前過度擬合,但這不應該是波動的原因(?)。 我不太擔心模型的性能。 我想達到大約 70% 的准確率。 我現在要做的就是穩定驗證精度並收斂。

筆記:

  • 在某些時期,訓練損失非常低(<0.1),但驗證損失非常高(>3)。
  • 這些視頻是在不同的背景下拍攝的,但每只狗在每個背景上的數量都相同。
  • 有些圖片有點模糊。

把優化器改成Adam,肯定更好。 在您的代碼中,您使用它但使用默認參數,您正在創建一個 SGD 優化器,但在編譯行中您引入了一個沒有參數的 Adam。 使用優化器的實際參數。

我鼓勵你先去掉 dropout,看看發生了什么,如果你設法過度擬合,從低 dropout 開始,然后再往上走。

也可能是因為你的一些測試樣本很難檢測,從而增加了損失,也許在驗證集中取出 shuffle 並觀察任何周期性,試圖找出是否存在難以檢測的驗證樣本。

希望能幫助到你!

我看到你嘗試了很多不同的東西。 幾點建議:

  1. 我看到你在你的Conv2D使用了大過濾器,例如。 11x115x5 如果您的圖像尺寸不是很大,則絕對應該選擇較低的過濾器尺寸,例如3x3
  2. 嘗試不同的優化器,如果沒有,請嘗試使用不同的lr Adam

否則,我看不出有太多問題。 也許你需要更多的數據讓網絡更好地學習。

暫無
暫無

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

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