训练TensorFlow LinearClassifier时遭遇TypeError错误求助
先把你遇到的错误信息整理出来,方便定位问题:
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Error reported to Coordinator: <class 'SystemError'>,returned a result with an error set
INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpodutz9be/model.ckpt.TypeError Traceback (most recent call last)
TypeError: expected bytes, float...
这个错误的核心是数据类型不匹配——TensorFlow在执行计算图时,预期接收字节类型的数据,但实际传入了浮点数(或者反过来),导致底层的TF_Run调用触发错误。下面是几个针对性的排查和解决步骤:
检查输入数据与模型输入的类型匹配度:
确认你的训练特征、标签的数据类型,和模型输入层定义的类型完全一致。比如如果模型输入层指定了tf.float32,但你的数据是bytes或者int64类型,就会触发这类错误。可以用print(type(your_train_data))或者tf.debugging.assert_type(your_data, tf.float32)这类工具快速验证。排查数据预处理环节的类型错误:
看看你加载数据(比如从CSV、TFRecord读取)或者做预处理(归一化、编码、分词)的时候,有没有不小心把数值类型转成了字符串/字节,或者反过来。比如用pandas读数据时,某些列被误识别为object类型(本质是字符串),直接喂给模型就会出问题。验证模型层的输入输出兼容性:
如果你用了自定义层、Lambda层或者一些特殊操作,要确认每一层的输出类型和下一层的输入类型匹配。比如某些操作可能会把张量的类型从float32转成string,导致后续计算报错。清理旧的检查点文件:
你看到的/tmp/tmpodutz9be/model.ckpt是临时生成的检查点,有时候旧的检查点和当前模型结构、数据类型不兼容,也会导致加载/保存时出错。直接删除这个临时目录下的所有文件,重新启动训练试试。升级TensorFlow到稳定版本:
如果是在用TensorFlow 1.x版本,这类底层执行错误在Jupyter环境中比较常见,建议升级到TensorFlow 2.x的稳定版本,新版本对数据类型的校验更友好,也修复了不少旧版本的bug。
如果是用Estimator API训练的话,额外要注意输入函数返回的(features, labels)元组,features字典里的每个值类型都要和模型的输入定义对齐。
内容的提问来源于stack exchange,提问作者Daria Smyrnova

