[英]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)
我嘗試過的事情。
我沒有嘗試過的事情
我的模型中似乎存在某種形式的隨機性或太多參數。 我知道它目前過度擬合,但這不應該是波動的原因(?)。 我不太擔心模型的性能。 我想達到大約 70% 的准確率。 我現在要做的就是穩定驗證精度並收斂。
筆記:
把優化器改成Adam,肯定更好。 在您的代碼中,您使用它但使用默認參數,您正在創建一個 SGD 優化器,但在編譯行中您引入了一個沒有參數的 Adam。 使用優化器的實際參數。
我鼓勵你先去掉 dropout,看看發生了什么,如果你設法過度擬合,從低 dropout 開始,然后再往上走。
也可能是因為你的一些測試樣本很難檢測,從而增加了損失,也許在驗證集中取出 shuffle 並觀察任何周期性,試圖找出是否存在難以檢測的驗證樣本。
希望能幫助到你!
我看到你嘗試了很多不同的東西。 幾點建議:
Conv2D
使用了大過濾器,例如。 11x11
和5x5
。 如果您的圖像尺寸不是很大,則絕對應該選擇較低的過濾器尺寸,例如3x3
。lr
Adam
。否則,我看不出有太多問題。 也許你需要更多的數據讓網絡更好地學習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.