TensorFlow模型保存的一个坑

最近工作需要,使用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)。

你可能感兴趣的:(算法)