1

hub是否可以在不链接训练代码的情况下从现有检查点创建模块?

4

1 回答 1

2

是的,一点没错。您需要一个包含 (1) 模块和 (2) 其变量中的正确值的会话。这些是来自实际训练还是仅仅恢复检查点并不重要。给定一个用于模型构建的 Python 库,它对 TensorFlow Hub 一无所知,您可以在旁边有一个工具用于导出到 Hub 模块,如下所示:

import tensorflow_hub as hub
import your_library as build_model_body

def module_fn():
  inputs = tf.placeholder(...)
  logits = build_model_body(inputs)
  hub.add_signature(inputs=inputs, outputs=logits)

def main(_):
  spec = hub.create_module_spec(module_fn)
  # Supply a checkpoint trained on a model from the same Python code.
  checkpoint_path = "..."
  # Output will be written here:
  export_path = "..."
  with tf.Graph().as_default():
    module = hub.Module(spec)
    init_fn = tf.contrib.framework.assign_from_checkpoint_fn(
        checkpoint_path, module.variable_map)
    with tf.Session() as session:
      init_fn(session)
      module.export(export_path, session=session)

需要注意的要点:

  • build_model_body()应该将输入转换为适合 Hub 模块的输出(例如,像素到特征向量),但不包括数据读取或损失和优化器。对于迁移学习,这些最好留给模块的使用者。可能需要进行一些重构。

  • 提供module.variable_map是必不可少的,以便将build_model_body()通过自身运行创建的普通变量名转换为通过实例化模块创建的变量名,存在于范围内module/state

于 2018-06-08T16:13:24.190 回答