在VGGNet培训中如何应对越来越多的损失和较低的验证准确性?

时间:2019-04-13 13:38:30

标签: conv-neural-network vgg-net

我正在尝试创建一个模型来预测绘画的艺术风格。为此,我使用的是Kaggle为他们的比赛提供的数据集,编号为Painter by Numbers。尽管数据集中有137种艺术风格,但我仅使用其中三种。这三种风格分别是-印象派,表现主义和超现实主义。我从每个班级拍摄了3000张图像来训练模型。此外,我使用了每个班级的300张图像,总共900张图像,以验证训练。 我计划将预训练的VGGNet用作模型的底层。我已经在Google Colab上训练了模型。现在的问题是,随着模型开始学习,损失越来越大,验证精度接近0.33,这令人不快。随机猜测也会提供这种准确性。

我创建了一个具有预训练VGGNet基础层的模型。我在前两层中添加了一些完全连接的层,其中有1024个神经元,第三层中有512个神经元,最后一层中有3个神经元。我使用的优化程序是SGD,学习率为0.01,衰减为1e-6,动量为0.9。我的损失函数是“ categorical_crossentropy”。此外,输入图像形状为(100,100,3)。 为了进行训练,我将每个时期的样本声明为100。该时期的数目为30。下面提供了所有代码。

model_vgg16_conv = VGG16(weights='imagenet', include_top=False)

input = Input(shape=(100,100,3), name='image_input')
output_vgg16_conv = model_vgg16_conv(input)

x = Flatten(name='flatten')(output_vgg16_conv) 
x = Dense( 1024, activation='relu', name='fc1')(x) 
x = Dense( 1024, activation='relu', name='fc2')(x)
x = Dense(  512, activation='relu', name='fc3')(x)
x = Dense(    3, activation='softmax', name='predictions')(x)

my_model = Model(input=input, output=x)

sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

my_model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.1, zoom_range=0.2, horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory(train_root, target_size=(100,100), batch_size=32, class_mode='categorical')
test_set = test_datagen.flow_from_directory(test_root, target_size=(100,100), batch_size=32, class_mode='categorical')

my_model.fit_generator(training_set, samples_per_epoch=100, nb_epoch=30, validation_data=test_set, nb_val_samples=300)

这会导致验证准确性低和损失值不断增加。甚至将损失值提高到10。此外,这也会导致验证准确性降低。如何使情况变得更好?

0 个答案:

没有答案