resnet50的验证Acc差且验证损失高

时间:2020-07-28 07:29:45

标签: python keras resnet transfer-learning

在试用了VGG16并取得了非常好的效果之后,我尝试从Imagenet训练ResNet50模型。首先,我将所有图层设置为可训练,因为我有一个大型数据集,并且对VGG16进行了相同的操作,但是结果很糟糕。

enter image description here

然后,我尝试将图层设置为不可训练,看看它是否会变好,但是效果仍然很差。

enter image description here

我的原始图像尺寸为384x384,但我将其尺寸调整为224x224。那是问题吗?还是在实施时做错了什么?

from keras import Input, Model
from keras.applications import ResNet50
from keras.layers import AveragePooling2D, Flatten, Dense, Dropout
from keras.optimizers import Adam
from keras_preprocessing.image import ImageDataGenerator


class example:
    def __init__(self):
        # define the names of the classes
        self.CLASSES = ["nok", "ok"]

        # initialize the initial learning rate, batch size, and number of
        # epochs to train for
        self.INIT_LR = 1e-4
        self.BS = 32
        self.NUM_EPOCHS = 32

    def build_model(self, train_path):
        train_data_path = train_path
        train_datagen = ImageDataGenerator(rescale=1. / 255, validation_split=0.25)

        train_generator = train_datagen.flow_from_directory(
        train_data_path,
        target_size=(224,224),
        color_mode="rgb",
        batch_size=self.BS,
        class_mode='categorical',
        subset='training')

        validation_generator = train_datagen.flow_from_directory(
        train_data_path,
        target_size=(224, 224),
        color_mode="rgb",
        batch_size=self.BS,
        class_mode='categorical',
        subset='validation')

        # load the ResNet-50 network, ensuring the head FC layer sets are left off
        baseModel = ResNet50(weights="imagenet", include_top=False,
        input_tensor = Input(shape=(224, 224, 3)))

        # construct the head of the model that will be placed on top of the the base model
        headModel = baseModel.output
        headModel = AveragePooling2D(pool_size=(7, 7))(headModel)
        headModel = Flatten(name="flatten")(headModel)
        headModel = Dense(256, activation="relu")(headModel)
        headModel = Dropout(0.5)(headModel)
        headModel = Dense(len(self.CLASSES), activation="softmax")(headModel)

        # place the head FC model on top of the base model (this will become the actual model we will train)
        model = Model(inputs=baseModel.input, outputs=headModel)

        for layer in baseModel.layers:
            layer.trainable = True

        # compile the model
        opt = Adam(lr=self.INIT_LR)#, decay=self.INIT_LR / self.NUM_EPOCHS)
        model.compile(loss="binary_crossentropy", optimizer=opt,
                  metrics=["accuracy"])

        from keras.callbacks import ModelCheckpoint, EarlyStopping
        import matplotlib.pyplot as plt

        checkpoint = ModelCheckpoint('resnetModel.h5', monitor='val_accuracy', verbose=1, save_best_only=True,
                                 save_weights_only=False, mode='auto', period=1)

        early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=6, verbose=1, mode='auto')

        hist = model.fit_generator(steps_per_epoch=self.BS, generator=train_generator,
                               validation_data=validation_generator, validation_steps=32, epochs=self.NUM_EPOCHS,
                               callbacks=[checkpoint, early])

        plt.plot(hist.history['accuracy'])
        plt.plot(hist.history['val_accuracy'])
        plt.plot(hist.history['loss'])
        plt.plot(hist.history['val_loss'])
        plt.title("model accuracy")
        plt.ylabel("Accuracy")
        plt.xlabel("Epoch")
        plt.legend(["Accuracy", "Validation Accuracy", "loss", "Validation Loss"])
        plt.show()

        plt.figure(1)

import tensorflow as tf

if __name__ == '__main__':
    x = example()
    config = tf.compat.v1.ConfigProto()
    config.gpu_options.allow_growth = True
    sess = tf.compat.v1.Session(config=config)
    x.build_model("C:/Users/but/Desktop/dataScratch/Train")

我有2类,分别包含具有缺陷和非缺陷图像的集成电路图像。我的批量大小是32,Epoches是32,LR是1e-4。

以下是示例图片:

enter image description here

这是缺陷图像

enter image description here

这是一张不错的图片

0 个答案:

没有答案