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

TensorFlow Keras ProgbarLogger参数不兼容问题求助

TensorFlow 2.16.1中ProgbarLogger参数不兼容问题的排查与解决

问题现象

在Python 3.10.14 + TensorFlow 2.16.1环境下,尝试使用count_mode参数初始化ProgbarLogger时触发错误:

import tensorflow as tf
pb = tf.keras.callbacks.ProgbarLogger(count_mode='steps')

错误信息:

TypeError: ProgbarLogger.__init__() got an unexpected keyword argument 'count_mode'

改用位置参数形式依然报错:

import tensorflow as tf
pb = tf.keras.callbacks.ProgbarLogger('steps')

错误信息:

TypeError: ProgbarLogger.__init__() takes 1 positional argument but 2 were given

但Keras及TensorFlow官方文档显示该参数存在,当前使用的是TensorFlow最新版本。

环境信息

  • Python版本:Python 3.10.14 | packaged by Anaconda, Inc. | (main, Mar 21 2024, 16:20:14) [MSC v.1916 64 bit (AMD64)] on win32
  • TensorFlow导入提示:
2024-04-08 10:38:02.032301: I tensorflow/core/util/port.cc:113] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2024-04-08 10:38:21.403223: I tensorflow/core/util/port.cc:113] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
  • 运行环境:VS Code

原因分析

  1. API版本变更:TensorFlow 2.16.x开始,Keras完全整合进tf.keras生态,ProgbarLogger的API发生了破坏性变更——原有的count_mode参数被移除,进度条的计数模式改为由训练时的参数(如steps_per_epoch)自动控制。
  2. 文档更新滞后:官方文档未及时同步API变更,导致旧文档内容与当前版本的实际API不匹配。
  3. 环境冲突(可能性低):若环境中同时安装了独立的keras包和tensorflow,可能存在导入混淆,但用户明确使用tf.keras.callbacks,此情况概率极低。

解决方法

方法1:适配新版API,自动控制计数模式

新版ProgbarLogger无需手动指定count_mode,只需在训练时通过model.fit()的参数控制计数逻辑:

  • 若需按steps计数,在model.fit()中指定steps_per_epoch参数;
  • 若需按samples计数,无需额外指定(默认行为,或指定sample_weight)。

示例代码:

import tensorflow as tf

# 初始化ProgbarLogger,无需额外参数
progbar_logger = tf.keras.callbacks.ProgbarLogger()

# 训练模型时指定steps_per_epoch,进度条自动按steps计数
model.fit(
    train_data,
    steps_per_epoch=100,  # 每轮训练100个steps
    epochs=10,
    callbacks=[progbar_logger]
)

方法2:验证当前环境的API参数

运行以下代码,查看当前环境中ProgbarLogger.__init__的实际可用参数,避免被旧文档误导:

import tensorflow as tf
help(tf.keras.callbacks.ProgbarLogger.__init__)

方法3:自定义回调实现特定计数逻辑(可选)

若需要更精细的控制,可自定义回调类替代ProgbarLogger,示例如下:

import tensorflow as tf
from tensorflow.keras.callbacks import Callback
import keras.utils.progbar as progbar

class CustomProgbarLogger(Callback):
    def __init__(self, count_mode='steps'):
        super().__init__()
        self.count_mode = count_mode
        self.progbar = None

    def on_train_begin(self, logs=None):
        self.epochs = self.params['epochs']
        self.target = self.params['steps'] if self.count_mode == 'steps' else self.params['samples']

    def on_epoch_begin(self, epoch, logs=None):
        print(f'Epoch {epoch+1}/{self.epochs}')
        self.progbar = progbar.Progbar(target=self.target)
        self.seen = 0

    def on_batch_end(self, batch, logs=None):
        logs = logs or {}
        if self.count_mode == 'steps':
            self.seen += 1
        else:
            self.seen += logs.get('size', 0)
        self.progbar.update(self.seen, values=[(k, v) for k, v in logs.items() if k not in ['size', 'batch']])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:20:07