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
相关产品推荐
相关产品推荐

