首页 > 解决方案 > CNN 损失图中的奇怪行为

问题描述

我已经用 8 个不同的类训练了我的 ResNet50 网络,在它完成训练后,我制作了训练和验证损失图。这是我的结果:

在此处输入图像描述

训练损失只出现在一半,因为我切断了 y 轴。

奇怪的事情是验证损失总是小于训练损失。我不知道为什么会发生这种情况,可能是使用班级权重吗?或者是别的什么?

编辑:验证集不是训练集的子集,我在程序中运行了文件夹,结果WinMerge它们 100% 不同,没有重复图像。

更奇怪的是,准确度图是正常的(验证最后的准确度较低),如您在此处看到的:

在此处输入图像描述

这是我使用的代码:

Resnet = ResNet50(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
model = tf.keras.Sequential(Resnet)
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dropout(0.5))
model.add(tf.keras.layers.Dense(units=no_classes, activation="softmax"))

checkpoint = tf.keras.callbacks.ModelCheckpoint(filepath='/content/check/Best_weigths_teste4.h5', save_weights_only=True,
                                                save_best_only=True,monitor='val_loss',
                                                mode='min',verbose=1) 

early_stop= tf.keras.callbacks.EarlyStopping(monitor='val_loss',mode='min', patience=10)

class_weight = {0: 20262./693,
                1: 20262./2658,
                2: 20262./2099,
                3: 20262./191,
                4: 20262./3617,
                5: 20262./10300,
                6: 20262./502,
                7: 20262./202}   

History= model.fit(x=train_generator, epochs = 50, callbacks=[checkpoint, early_stop], validation_data=val_generator, class_weight=class_weight).history

#to plot loss and acc
plt.figure()
plt.ylabel("Loss")
plt.xlabel("Epochs")
plt.ylim([0,5])
plt.plot(History['loss'])
plt.plot(History['val_loss'])
plt.legend(['train', 'validation'], loc='upper right')

plt.figure()
plt.ylabel("Accuracy (training and validation)")
plt.xlabel("Epochs")
plt.ylim([0,1])
plt.plot(History["accuracy"])
plt.plot(History["val_accuracy"])
plt.legend(['train', 'validation'], loc='upper right')

PS:我不知道这是否相关,但这就是我创建生成器的方式(我使用flow_from directory):

train_dataGen = ImageDataGenerator(rescale=None,horizontal_flip=True,vertical_flip=True,
                                   preprocessing_function=rotate_image)
val_dataGen = ImageDataGenerator(rescale=None)

train_generator = train_dataGen.flow_from_directory(directory="./novo2/train_pad_cc",
                                                    class_mode="categorical",
                                                    batch_size=32,
                                                    shuffle = True, seed = 1)

val_generator = val_dataGen.flow_from_directory(directory="./novo2/val_pad_cc",
                                                    class_mode="categorical",
                                                    batch_size=32,
                                                    shuffle = False, seed = 2)

标签: pythonkeras

解决方案


推荐阅读