TensorFlow模型保存的一个坑

来源:互联网 发布:matlab画数据分布图 编辑:程序博客网 时间:2024/06/04 19:15

最近工作需要,使用tensorflow(r1.3)中contrib的某个库,根据tf官网的说法,go版本是只能调用py版本训练好的模型,而个人对go比较熟且线上环境用go作服务,所以想用go调python训练好的模型。

使用python import tf和tf.contrib相关库,使用tf.saved_model.builder.SavedModelBuilder保存模型,但使用go使用LoadSavedModel的时候,会报形如Not found Op type not registered 'CountExtremelyRandomStats' 的错误,具体的话是说在libtensorflow里面找不到CountExtremelyRandomStats 这个op。

尝试了很多方案,略过。最终发现问题是TensorFlow在BUILD target:libtensorflow.so的时候,根本没有把contrib相关内容打进去。修改根BUILD文件的libtensorflow.so部分如下:

cc_binary(    name = "libtensorflow.so",    linkopts = select({        "//tensorflow:darwin": [            "-Wl,-exported_symbols_list",  # This line must be directly followed by the exported_symbols.lds file            "//tensorflow/c:exported_symbols.lds",        ],        "//tensorflow:windows": [],        "//tensorflow:windows_msvc": [],        "//conditions:default": [            "-z defs",            "-s",            "-Wl,--version-script",  #  This line must be directly followed by the version_script.lds file            "//tensorflow/c:version_script.lds",        ],    }),    linkshared = 1,    deps = [        "//tensorflow/contrib:contrib_kernels",        "//tensorflow/contrib:contrib_ops_op_lib",        "//tensorflow/c:c_api",        "//tensorflow/c:exported_symbols.lds",        "//tensorflow/c:version_script.lds",        "//tensorflow/core:tensorflow",    ],)

contrib那两行依赖是新加进去的,然后重新用bazel编译一个libtensorflow就可以了。期间困惑的是为什么python用pip装的就可以用contrib呢,观察tools/pip_packages/BUILD文件发现pip的包,是包含了所有contrib的依赖的。感觉官方团队对非python语言的重视还不够,没有明显说明这个东西,有人提了issue也没有人回应(我最后回应了这个op相关的一个issue:https://github.com/tensorflow/tensorflow/issues/14358)。

原创粉丝点击