我的模型的验证损失正经历着巨大的波动,并且没有收敛。
我正在与我的三只狗一起进行图像识别项目,即在图像中对狗进行分类。两只狗非常相似,第三条则非常不同。我分别给每只狗拍了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%的准确性。我现在要做的只是稳定验证准确性并收敛。
注意:
答案 0 :(得分:1)
将优化器更改为Adam,绝对更好。在您的代码中使用它,但是使用默认参数,您正在创建SGD优化器,但是在编译行中,您将引入一个不带参数的Adam。发挥优化器的实际参数。
我建议您先退出辍学,看看发生了什么,如果您过度适应,首先从辍学率低开始,然后继续攀登。
这也可能是由于您的一些测试样本很难检测到,从而增加了损失,也许是去除了验证集中的混洗,并观察了任何周期性以试图找出是否存在验证样本困难进行检测。
希望有帮助!
答案 1 :(得分:1)
我看到您尝试了很多不同的方法。一些建议:
Conv2D
中使用大型过滤器,例如11x11
和5x5
。如果图像尺寸不是很大,则绝对应该使用较低的滤镜尺寸,例如3x3
。Adam
和不同的lr
。否则,我看不出太多问题。也许您需要更多的数据来使网络更好地学习。