You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Keras的CSVLogger记录准确率与打印值不一致如何解决

问题解决方法

核心问题原因

CSVLogger保存的准确率固定、和控制台输出不一致的问题,主要由以下几个代码写法问题导致:

  • 回调参数传入格式错误:model.fit的callbacks参数要求传入回调对象的序列(列表/元组),你当前写的callbacks=(csv_logger)不会被识别为元组,Python会将其判定为单个变量,导致回调触发逻辑异常,日志写入逻辑出错。
  • 追加写入旧文件冲突:你开启了CSVLogger的append=True参数,如果之前运行生成过同名CSV文件,新的训练日志会追加到旧文件末尾,你看到的固定准确率大概率是之前旧训练的结果,和当前训练的控制台输出自然不一致。
  • 回调初始化时机问题:你在模型compile之前就初始化了CSVLogger,部分版本的Keras会因为回调初始化时还没读取到模型的metrics配置,导致日志采集字段异常。

修正后的代码

import numpy as np
from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import CSVLogger
import os

# 提前删除旧的日志文件,避免追加冲突
if os.path.exists("Keras_pd_data10000.csv"):
    os.remove("Keras_pd_data10000.csv")

# 加载数据集
data = loadtxt('/Users/ciarasikking/Desktop/Research/Python Codes/Parkinsons Data/pd_speech_features.csv', delimiter=',')
data_pd = np.delete(data, [0], 1)
# 切分为输入特征X和输出标签y
X = data_pd[:,0:753]
y = data_pd[:,753]

# 定义Keras模型
model_pd = Sequential()
model_pd.add(Dense(1, input_dim=753, activation='sigmoid'))
model_pd.add(Dense(1, activation='sigmoid'))

# 先编译模型,再初始化CSVLogger
model_pd.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 关闭追加模式,每次训练重写日志文件
csv_logger = CSVLogger("Keras_pd_data10000.csv", append=False)

# fit方法的callbacks参数传入列表格式的回调对象
model_pd.fit(X, y, epochs=10000, batch_size=10, callbacks=[csv_logger])

附加优化建议

你的模型输出层用了两层Sigmoid激活的全连接层,会导致输出值被两次压缩到0-1区间,反而降低模型拟合能力,建议把第一层Dense的激活改成relu,适当提升隐藏层维度,只保留输出层的sigmoid,训练收敛速度和准确率都会有明显提升:

model_pd = Sequential()
# 隐藏层用relu激活,维度调整为32提升拟合能力
model_pd.add(Dense(32, input_dim=753, activation='relu'))
# 输出层用sigmoid做二分类
model_pd.add(Dense(1, activation='sigmoid'))

内容的提问来源于stack exchange,提问作者Ciara Sikking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:54:03