为什么训练VGG16时的准确度变化不大?

2024-10-05 14:29:43 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在尝试在VGG-16模型上训练一个数据集。问题是准确度变化不大,但它并没有固定在一个固定的精度上。下面是情节图。有什么建议吗?在

我已经遵循了几个指南来解决这个问题,这是关于卡住的准确性,但他们不起作用。在

{1美元^

编辑:

200个时代

200 Epoch Plot

Imagenet权重

50 Epochs with Imagenet Weights

代码

该模型的输入大小为600张224x224x3的图像。此外,还有两个标签dog和cat(0,1)。在

属性

imageSize = (224,224,3)
epochs = 25
batch_size = 32

型号

^{pr2}$

图像生成器

from keras.applications.vgg16 import preprocess_input
from keras.preprocessing import image
from keras.preprocessing.image import ImageDataGenerator

imgGen = ImageDataGenerator(rotation_range=20,
                            width_shift_range=0.1,
                            height_shift_range=0.1,
                            shear_range=0.1,
                            zoom_range=0.2,
                            horizontal_flip=True,
                            vertical_flip=True,
                            preprocessing_function = preprocess_input)

拟合模型

r = model.fit_generator(imgGen.flow(trainX, trainY, batch_size=batch_size),
                        validation_data = imgGen.flow(testX, testY, batch_size=batch_size),
                        epochs=epochs,
                        steps_per_epoch=len(trainX)//batch_size,
                        validation_steps=len(testX)//batch_size,
                        verbose = 1,
                       )



Tags: from模型图像imageimportinputsizebatch
3条回答

不要使用adam优化器来训练VGG,众所周知,它失败的原因是VGG网络中的大量参数。只需使用sgd并调整学习速率,比如从0.01开始,增加10倍或0.1倍,直到训练损失很好地减少。在

我建议您对预先训练的模型进行微调,并冻结前几层的权重。 比如:

vgg = VGG16(input_shape=imageSize,weights='imagenet',include_top=False)
for layer in vgg.layers[0:-10]:
    layer.trainable = false

25个时代还不够,试试100个时代或200个时代

def model(self):
    inputs = keras.layers.Input(shape=self.input_Shape)
    x = keras.layers.Conv2D(16, (3,3), activation='relu')(inputs)
    x = keras.layers.MaxPooling2D(2,2)(x)
    x = keras.layers.Conv2D(32,(3,3),activation='relu')(x)
    x = keras.layers.MaxPooling2D(2,2)(x)
    x = keras.layers.Conv2D(64,(3,3),activation='relu')(x)
    x = keras.layers.MaxPooling2D(2,2)(x)
    x = keras.layers.Flatten()(x)
    x = keras.layers.Dense(512,activation='relu')(x)
    outputs = keras.layers.Dense(1,activation='sigmoid')(x)

    model = keras.models.Model(inputs, outputs)
    model.summary()
    model.compile(optimizer=RMSprop(lr=0.001),
                  loss='binary_crossentropy',
                  metrics = ['acc'])

    return model

相关问题 更多 >