为什么训练 VGG-16 时准确率变化不大?

Kas*_*sen 2 python deep-learning keras tensorflow

目前,我正在尝试在 VGG-16 模型上训练数据集。问题是准确度没有太大变化,但它并没有被固定在一个固定的准确度上。情节图可以在下面看到。任何建议为什么会发生这种情况?

我已经按照几个指南来解决这个关于卡住精度的问题,但它们不起作用。

精度图

编辑:

200个时代

200 纪元图

50 个具有 Imagenet 权重的 Epoch

50 个具有 Imagenet 权重的 Epoch

代码

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

特性

imageSize = (224,224,3)
epochs = 25
batch_size = 32
Run Code Online (Sandbox Code Playgroud)

模型

from keras.applications.vgg16 import VGG16
vgg = VGG16(input_shape=imageSize,weights=None,include_top=False)

x = Flatten()(vgg.output)
prediction = Dense(1,activation='sigmoid')(x)

model = Model(inputs=vgg.input,outputs=prediction)
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

图像生成器

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)
Run Code Online (Sandbox Code Playgroud)

拟合模型

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,
                       )


Run Code Online (Sandbox Code Playgroud)

Mat*_*gro 7

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


小智 0

25 epoch 不够,尝试 100 epoch 或 200 epoch

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
Run Code Online (Sandbox Code Playgroud)