You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多模型训练损失曲线绘制及Keras History对象属性报错求助

解决Keras多模型训练历史区分与绘制问题

我来帮你理清这个问题,其实核心是你对Keras的History对象结构有点误解,咱们一步步解决:

问题根源

你提到的报错History object has no attribute 'history1',是因为你错误地尝试访问History对象的history1属性,但实际上每个model.fit()返回的History实例,只有一个固定的history属性——这是一个字典,专门用来存储当前模型的训练/验证指标(比如loss、accuracy等)。

每个模型的训练历史是完全独立的,只要你用不同的变量名分别保存每个fit()的返回结果,就不会出现混淆的问题。

解决方案步骤

1. 分别保存每个模型的训练历史

给每个模型的训练历史分配独立的变量,比如history_seqhistory_convhistory_mix,对应你的三个模型:

# 训练sequential模型,保存历史到history_seq
history_seq = sequential.fit(
    data_generator.flow(train_x, to_categorical(train_y), batch_size=BATCH_SIZE),
    steps_per_epoch=len(train_x) / BATCH_SIZE,
    validation_data=data_generator.flow(val_x, to_categorical(val_y), batch_size=BATCH_SIZE),
    validation_steps=len(val_x) / BATCH_SIZE,
    epochs=NUM_EPOCHS
)

# 训练conv模型,保存历史到history_conv
history_conv = conv.fit(
    data_generator.flow(train_x, to_categorical(train_y), batch_size=BATCH_SIZE),
    steps_per_epoch=len(train_x) / BATCH_SIZE,
    validation_data=data_generator.flow(val_x, to_categorical(val_y), batch_size=BATCH_SIZE),
    validation_steps=len(val_x) / BATCH_SIZE,
    epochs=NUM_EPOCHS
)

# 训练mix模型,保存历史到history_mix
history_mix = mix.fit(
    data_generator.flow(train_x, to_categorical(train_y), batch_size=BATCH_SIZE),
    steps_per_epoch=len(train_x) / BATCH_SIZE,
    validation_data=data_generator.flow(val_x, to_categorical(val_y), batch_size=BATCH_SIZE),
    validation_steps=len(val_x) / BATCH_SIZE,
    epochs=NUM_EPOCHS
)

2. 绘制单个模型的损失曲线

用你原本的绘图代码,替换对应的History对象即可,每个模型的曲线互不干扰:

# 绘制sequential模型的损失曲线
plt.plot(history_seq.history['loss'])
plt.plot(history_seq.history['val_loss'])
plt.title('Sequential Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.show()

# 绘制conv模型的损失曲线
plt.plot(history_conv.history['loss'])
plt.plot(history_conv.history['val_loss'])
plt.title('Conv Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.show()

# 绘制mix模型的损失曲线
plt.plot(history_mix.history['loss'])
plt.plot(history_mix.history['val_loss'])
plt.title('Mix Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper right')
plt.show()

3. 可选:多模型损失曲线对比

如果想把三个模型的训练/验证损失放在同一张图里对比,方便观察差异,可以这样写:

plt.figure(figsize=(10, 6))

# 绘制sequential模型的损失
plt.plot(history_seq.history['loss'], label='Sequential Train')
plt.plot(history_seq.history['val_loss'], label='Sequential Val')

# 绘制conv模型的损失
plt.plot(history_conv.history['loss'], label='Conv Train')
plt.plot(history_conv.history['val_loss'], label='Conv Val')

# 绘制mix模型的损失
plt.plot(history_mix.history['loss'], label='Mix Train')
plt.plot(history_mix.history['val_loss'], label='Mix Val')

plt.title('All Models Loss Comparison')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(loc='upper right')
plt.grid(True)
plt.show()

这样你就能清晰地区分每个模型的训练历史,再也不会出现属性错误啦。

内容的提问来源于stack exchange,提问作者Maha Al

火山引擎 最新活动