多模型训练损失曲线绘制及Keras History对象属性报错求助
解决Keras多模型训练历史区分与绘制问题
我来帮你理清这个问题,其实核心是你对Keras的History对象结构有点误解,咱们一步步解决:
问题根源
你提到的报错History object has no attribute 'history1',是因为你错误地尝试访问History对象的history1属性,但实际上每个model.fit()返回的History实例,只有一个固定的history属性——这是一个字典,专门用来存储当前模型的训练/验证指标(比如loss、accuracy等)。
每个模型的训练历史是完全独立的,只要你用不同的变量名分别保存每个fit()的返回结果,就不会出现混淆的问题。
解决方案步骤
1. 分别保存每个模型的训练历史
给每个模型的训练历史分配独立的变量,比如history_seq、history_conv、history_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




