我的CNN图像识别模型会产生波动的验证损失

时间:2019-05-07 12:07:57

标签: python keras conv-neural-network

我的模型的验证损失正经历着巨大的波动,并且没有收敛。

我正在与我的三只狗一起进行图像识别项目,即在图像中对狗进行分类。两只狗非常相似,第三条则非常不同。我分别给每只狗拍了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')

此图片是以下模型的结果。enter image description here

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)
  • 在两个密集层中将压差增加到0.5
  • 增加/减小两个密集层的大小(128分钟-> 4048以下)
  • CNN层数增加
  • 介绍动量
  • 增加/减少批量大小

我没有尝试过的事情

  • 我没有使用任何其他损失或指标
  • 我没有使用其他优化程序。
  • 尚未调整CNN图层的任何参数

在我的模型中似乎存在某种形式的随机性或过多的参数。我知道它当前过度拟合,但这不应该是波动性的原因(?)。 我不太担心模型的性能。我希望达到约70%的准确性。我现在要做的只是稳定验证准确性并收敛。

注意:

  • 在某些时期,训练损失非常低(<0.1),但经过验证 损耗非常高(> 3)。
  • 这些视频是在不同的背景下拍摄的,但+-每只狗在每个背景上的拍摄量都是相同的。
  • 有些图像有点模糊。

2 个答案:

答案 0 :(得分:1)

将优化器更改为Adam,绝对更好。在您的代码中使用它,但是使用默认参数,您正在创建SGD优化器,但是在编译行中,您将引入一个不带参数的Adam。发挥优化器的实际参数。

我建议您先退出​​辍学,看看发生了什么,如果您过度适应,首先从辍学率低开始,然后继续攀登。

这也可能是由于您的一些测试样本很难检测到,从而增加了损失,也许是去除了验证集中的混洗,并观察了任何周期性以试图找出是否存在验证样本困难进行检测。

希望有帮助!

答案 1 :(得分:1)

我看到您尝试了很多不同的方法。一些建议:

  1. 我看到您在Conv2D中使用大型过滤器,例如11x115x5。如果图像尺寸不是很大,则绝对应该使用较低的滤镜尺寸,例如3x3
  2. 尝试使用其他优化器,如果没有,请尝试使用Adam和不同的lr

否则,我看不出太多问题。也许您需要更多的数据来使网络更好地学习。