关于tensorflow的报错NodeDef mentions attr ‘xxx‘ not in Op的解决方案和产生原因

在尝试使用下载的pb文件(frozen graph)时遇上了这个问题,报错信息如下。

Traceback (most recent call last):
  File "/home/shuaige/anaconda3/envs/tf15/lib/python3.7/site-packages/tensorflow_core/
python/framework/importer.py", line 501, in _import_graph_def_internal
    graph._c_graph, serialized, options)  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: NodeDef mentions attr 
'explicit_paddings' not in Op<name=MaxPool; signature=input:T -> output:T; attr=T:
type,default=DT_FLOAT,allowed=[DT_HALF, DT_BFLOAT16, DT_FLOAT, DT_DOUBLE, DT_INT32, 
DT_INT64, DT_UINT8, DT_INT16, DT_INT8, DT_UINT16, DT_QINT8]; attr=ksize:list(int),
min=4; attr=strides:list(int),min=4; attr=padding:string,allowed=["SAME", "VALID"]; 
attr=data_format:string,default="NHWC",allowed=["NHWC", "NCHW", "NCHW_VECT_C"]>; 
NodeDef: {{node pool1/MaxPool}}. (Check whether your GraphDef-interpreting binary 
is up to date with your GraphDef-generating binary.).

不说废话,先说结论:
产生这个bug的原因是因为读取pb文件的环境(也就是你tensorflow的版本)比这个pb文件生成的环境(也就是训练使用的tensorflow版本)的版本低,比如文件是在tensorflow2.4保存的,你在tensorflow1.x读取。

所以将读取文件的tensorflow升级成与训练环境匹配的版本相匹配,就可以解决问题了。

需要注意的是:即使是tf2.x下运用tf.disable_eager_execution()和disable_v2_behavior()运行1.x的保存函数,出来的文件也可能不会被tf1.x的函数读取,所以尽量版本保持一致。

解决思路:
这一段可以说是非常晦涩难懂了,看到时真的无从下手。根据报错信息’/python/framework/importer.py’大概可以推出这段是在读取文件时遇上了问题。

加上‘Check whether your GraphDef-interpreting binary is up to date with your GraphDef-generating binary’这段告诉我们是GraphDef-interpreting binary的问题。众所周知,pb文件的保存原理是将模型serialize成二进制文件,所以从binary能想到可能是不同tf版本所使用的二进制读取和保存方法有更新,所以用旧的二进制读取工具读取新的会遇上问题。 果然是这样!

碎碎念:

tensorflow可太难用了! 淦!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值