更换电脑后Transformer训练在首个Epoch末尾触发progbar.py TypeError
Transformer翻译模型训练报错排查
问题情况
更换新笔记本后,自研的简易Transformer翻译模型在首个Epoch训练结束时直接报错。代码使用model.fit()并自行覆写了train_step()方法,核心调用代码如下:
h = model.fit( ds.ds_tra, epochs=epochs, validation_data=ds.ds_val )
具体报错日志
15/15 ━━━━━━━━━━━━━━━━━━━━ 0s 2s/step - masked_acc: 0.2338 - loss: 7.9628Traceback (most recent call last): File "C:\_P\dev\ai\AI1\tfe\translators\seq2seq_11\seq2seq_tst_train1.py", line 113, in <module> h = model.fit( ^^^^^^^^^^ File "C:\Users\u2gil\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\traceback_utils.py", line 122, in error_handler raise e.with_traceback(filtered_tb) from None File "C:\Users\u2gil\AppData\Local\Programs\Python\Python311\Lib\site-packages\keras\src\utils\progbar.py", line 92, in update self._values[k] = [v * value_base, value_base] ~~^~~~~~~~~~~~ TypeError: unsupported operand type(s) for *: 'dict' and 'int'
环境对比
- 旧电脑:Windows 10,代码可正常运行
- 新电脑:Windows 11、Core Ultra 7处理器、Python 3.11.9、Keras 3.6.0、Numpy 1.26.4、TensorFlow 2.17.0
解决办法
这个报错是因为Keras 3.x对train_step()的返回值格式要求比旧版本更严格。旧版Keras可能允许返回嵌套字典,但新版本中train_step()必须返回纯标量值的字典,不能存在字典嵌套的情况。
检查你自行实现的train_step()方法:
- 确保返回的每个指标(如loss、masked_acc)都是单个数值类型的Tensor,不能是字典
- 举个例子,如果之前写的是
return {"masked_acc": {"val": acc_result}},改成直接返回return {"masked_acc": acc_result} - 另外,注意Keras 3与TensorFlow 2.17的适配,所有指标计算需符合Keras 3的API规范
内容的提问来源于stack exchange,提问作者u2gilles
相关产品推荐
相关产品推荐

