如何使用Pyplot绘制Keras模型训练准确率曲线及解决运行报错问题
代码错误修正方案
以下是你代码中存在的问题和对应修改方法:
- 缺失绘图库导入:你直接使用
plt调用绘图接口,但没有导入对应依赖,在代码开头添加导入语句即可:import matplotlib.pyplot as plt - 优化器参数不兼容:新版本TensorFlow的Adam优化器已废弃
lr参数,替换为learning_rate,修改编译部分的优化器配置:optimizer=tf.keras.optimizers.Adam(learning_rate=base_learning_rate) - 损失函数与输出层配置不匹配:你输出层用2神经元+softmax激活的配置,对应多分类损失函数,同时
from_logits=True要求输出层没有激活函数,两者完全冲突,两种修改方案二选一即可:- 方案1(适配二分类场景):输出层改为1神经元+sigmoid激活,损失函数保持BinaryCrossentropy,删除
from_logits=True参数# 输出层修改 tf.keras.layers.Dense(1, activation="sigmoid") # 损失函数修改 loss=tf.keras.losses.BinaryCrossentropy() - 方案2(保持2分类softmax输出):损失函数替换为多分类交叉熵,关闭logits参数,同时确认你的标签已经做了one-hot编码
loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False)
- 方案1(适配二分类场景):输出层改为1神经元+sigmoid激活,损失函数保持BinaryCrossentropy,删除
- 训练变量未定义:你没有加载本地数据集、做预处理和训练集验证集拆分,
x_train/y_train/x_val/y_val四个变量都不存在,需要补充数据集加载和拆分的代码,示例逻辑如下:# 此处替换为你自己的数据集加载逻辑,示例为加载本地图片目录 dataset = tf.keras.utils.image_dataset_from_directory( "你的数据集目录路径", image_size=(224,224), batch_size=32, label_mode="categorical" ) # 拆分训练集验证集 train_size = int(0.8 * len(dataset)) val_size = len(dataset) - train_size x_train = dataset.take(train_size) x_val = dataset.skip(train_size).take(val_size)
修正后完整可运行代码参考
import tensorflow as tf import matplotlib.pyplot as plt # 加载数据集,替换为你自己的数据集路径 dataset = tf.keras.utils.image_dataset_from_directory( "./dataset", image_size=(224, 224), batch_size=32, label_mode="categorical" ) # 拆分训练验证集 train_size = int(0.8 * len(dataset)) val_size = len(dataset) - train_size x_train = dataset.take(train_size) x_val = dataset.skip(train_size).take(val_size) base_model = tf.keras.applications.MobileNetV2(input_shape = (224, 224, 3), include_top = False, weights = "imagenet") base_model.trainable = False model = tf.keras.Sequential([ base_model, tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(2, activation="softmax") ]) base_learning_rate = 0.00001 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=base_learning_rate), loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False), metrics=['accuracy']) history = model.fit(x_train, epochs = 500 , validation_data = x_val) acc = history.history['accuracy'] val_acc = history.history['val_accuracy'] loss = history.history['loss'] val_loss = history.history['val_loss'] epochs_range = range(500) plt.figure(figsize=(15, 15)) plt.subplot(2, 2, 1) plt.plot(epochs_range, acc, label='训练准确率') plt.plot(epochs_range, val_acc, label='验证准确率') plt.legend(loc='lower right') plt.title('训练和验证准确率') plt.subplot(2, 2, 2) plt.plot(epochs_range, loss, label='训练损失') plt.plot(epochs_range, val_loss, label='验证损失') plt.legend(loc='upper right') plt.title('训练和验证损失') plt.show()
内容的提问来源于stack exchange,提问作者Nusry KR
相关产品推荐
相关产品推荐

