python - 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)
解决方案
推荐阅读
- xml - 使计时器仅在第一次滴答时执行代码(Visual Basic)
- ios - 自由形式子视图的宽度不会扩展到设备屏幕尺寸
- python - 按月分组,但只获取 Pandas 列中真实值的总计
- javascript - Discord.js 在特定时间做某事
- javascript - 从单独(不属于我)域上的 iframe 获取 src 属性(视频链接)到我自己的网站(动态)
- swiftui - 根据 SwiftUI 中的内容制作 VStack 高度
- registry - URI 方案映射 - 使用 shell/open/command 时如何将步骤添加到 cd 到某个目录
- node.js - 如何构建 npm 依赖项以在 Dockerfile 中使用?
- json - 删除 UTF-8 Azure 存储 Blob JSON 中的 BOM,留下不可用的 JSON
- python - Selenium problem in VS Code Interactive Mode