使用 Python 实例化 TensorFlow 模型时出现 google.protobuf.text_format.ParseError
Posted
技术标签:
【中文标题】使用 Python 实例化 TensorFlow 模型时出现 google.protobuf.text_format.ParseError【英文标题】:google.protobuf.text_format.ParseError when instantiating a TensorFlow model with Python 【发布时间】:2017-11-01 15:07:55 【问题描述】:我使用的是 Ubuntu 16.04。我有:Python 2.7.12、Python 3.5.2、tensorflow 1.2.0-rc1、protobuf 3.3.0。
我想关注这个tutorial。
但我认为这个 test.py 可以更简洁地证明我的问题:
import tensorflow as tf
regressor = tf.contrib.learn.LinearRegressor(feature_columns=[])
我无法实例化回归器。我得到(最后的完整追溯):
google.protobuf.text_format.ParseError: 48:12 : 消息类型“tensorflow.AttrValue”没有名为“5”的字段。
本教程的 [21] 也是如此。 python2和python3也是如此。如果我使用 LinearClassifier 而不是 LinearRegressor,也是如此。
知道我做错了什么吗?
Traceback(最近一次调用最后一次):
文件“test.py”,第 2 行,在 regressor = tf.contrib.learn.LinearRegressor(feature_columns=[])
文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/python/util/lazy_loader.py", 第 53 行,在 getattr 中 模块 = self._load()
文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/python/util/lazy_loader.py", 第 42 行,在 _load 模块 = importlib.import_module(self.name)
文件“/usr/lib/python2.7/importlib/init.py”,第 37 行,在 导入模块 进口(名称)
文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/init.py", 第 35 行,在 从 tensorflow.contrib 导入图片
文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/image/init.py", 第 40 行,在 来自 tensorflow.contrib.image.python.ops.single_image_random_dot_stereograms 导入 single_image_random_dot_stereograms
文件 “/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/image/python/ops/single_image_random_dot_stereograms.py”, 第 26 行,在 "_single_image_random_dot_stereograms.so"))
文件 "/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/util/loader.py", 第 55 行,在 load_op_library 中 ret = load_library.load_op_library(路径)
文件 “/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/load_library.py”, 第 84 行,在 load_op_library 中 exec(包装器,模块。dict)
文件“”,第 248 行,在
文件“”,第 114 行,在 _InitOpDefLibrary 中
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 481 行,在合并中 描述符池=描述符池)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 535 行,在 MergeLines 返回 parser.MergeLines(lines, message)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 568 行,在 MergeLines 中 self._ParseOrMerge(lines, message)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 583 行,在 _ParseOrMerge self._MergeField(tokenizer, message)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 684 行,在 _MergeField 中 合并(分词器、消息、字段)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 773 行,在 _MergeMessageField self._MergeField(tokenizer, sub_message)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 684 行,在 _MergeField 中 合并(分词器、消息、字段)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 773 行,在 _MergeMessageField self._MergeField(tokenizer, sub_message)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 684 行,在 _MergeField 中 合并(分词器、消息、字段)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 773 行,在 _MergeMessageField self._MergeField(tokenizer, sub_message)
文件 "/usr/local/lib/python2.7/dist-packages/google/protobuf/text_format.py", 第 652 行,在 _MergeField 中 (message_descriptor.full_name, name))
【问题讨论】:
我不认为你做错了什么。我可以使用来自 GitHub 的全新 Tensorflow r1.2 在 Ubuntu 17.04 和 Python 3.5.3 上构建来确认这个错误 在 Tensorflow r1.1regressor = tf.contrib.learn.LinearRegressor(feature_columns=[])
上断言,因为 feature_columns
可能不是空的,但是 protobuf 没有错误,所以它必须从 r1.1 更改为 r1.2导致这个。
感谢 Maximilian 确认错误。我补充说,它似乎正在使用来自包tensorflow.org/versions/r1.2/install/… 的自定义二进制protobuf pip 与python3 一起使用。 (事实上,在我的简单示例中给出 AssertionError 是您所说的正常行为。)
一个问题现在在github.com/tensorflow/tensorflow/issues/10370发布
我已经更新了我的解决方案,以包含 cwhipkey 在 GitHub 上建议的解决方法。在我的情况下,更新的二进制 protobuf 包没有帮助。
【参考方案1】:
解决方案
更改您的数字区域设置以使用 句点 (.) 而不是逗号 (,) 作为小数分隔符。
说明
在 Google protobuf 实现中,使用一个依赖于语言环境的函数将浮点数转换为 FloatToBuffer()
中的字符串。
当自动从插件库中提取信息时,这会成为一个问题。
在你的情况下,它是序列
eye_separation: float = 2.5
在emphasized _single_image_random_dot_stereograms.so
中的偏移0xa3b4
在输入到使用FloatToBuffer()
的解析器后,会出现:
attr \n'
name: "eye_separation"\n'
type: "float"\n'
default_value \n'
f: 2,5\n'
\n'
\n'
然后标记器(google/protobuf/text_format.py
)被默认值中的,
混淆,并认为5
是一个单独的字段。
错误报告已在 GitHub 发布,因此希望很快得到修复。
【讨论】:
我尝试按照您的建议更改区域设置:System Settings > Language Support > Regional Format > Display numbers, dates and currency amounts in the usual format for: English (United States)
,但问题并没有消失。我应该遵循特定的程序吗?谢谢。【参考方案2】:
对我来说,运行 export LC_ALL=C
有效。
//埃里克
【讨论】:
它也适用于我。你能解释一下这个命令的作用吗?谢谢。 Maximilian 发现解决方法是更改数字区域设置以使用句点(.)
而不是逗号 (,)
作为小数分隔符。 export LC_ALL=C
将所有语言环境设置为 POSIX“标准”之一,其中句点 (.)
是小数点分隔符。【参考方案3】:
解决了它的问题:
import _locale
_locale.setlocale(_locale.LC_NUMERIC, 'en_US.UTF-8')
python3.6、freebsd11
【讨论】:
以上是关于使用 Python 实例化 TensorFlow 模型时出现 google.protobuf.text_format.ParseError的主要内容,如果未能解决你的问题,请参考以下文章
将模型从 tensorflow 转换为 Coreml (4.0) 时出现实例归一化错误
tensorflow 批次读取文件内的数据,并将顺序随机化处理. --[python]
构建神经网络 [TensorFlow 2.0] 模型子类化 - ValueError/TypeError