使用 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 行,在 _MergeMes​​sageField 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 行,在 _MergeMes​​sageField 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 行,在 _MergeMes​​sageField 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.1 regressor = 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

(tensorflow CNN)验证码识别--生成验证码

TensorFlow安装及实例-(Ubuntu16.04.1 & Anaconda3)

Python:为啥 Tkinter 类实例化必须使用 Frame?