Tensorflow hub 标签和导出

Tensorflow hub tags and exporting

我很困惑标签应该如何在集线器中工作以及在导出时如何使用它们。我如何在图表的火车部分进行训练并导出服务部分?

我有以下代码:

def user_module_fn(foo, bar):
    x = tf.sparse_placeholder(tf.float32, shape[-1, 32], name='name')
    y = something(x)
    hub.add_signature(name='my_name', input={"x": x}, output={"default", y})

module_spec = hub.create_module_spec(module_spec_fn, tags_and_args=[
   (set(), {"foo": foo, "bar": bar}),
   ({"train"}, {"foo": foo, "bar": baz})
 ])

m = hub.Module(module_spec, name="my_name", trainable=True, tags={"train"})

hub.register_for_export(m, "my_name")

我的问题如下:因为我将模块 m 实例化为 tags={'train'},我认为我正在使用正确的模块进行训练。这是否意味着我 导出标有 train 的文件?我如何使用 train 进行训练并使用 set()(默认)进行服务?

在最好的(即最简单的)情况下,您的模块根本不需要任何标签,即当同一个 TensorFlow 图适合模块的所有预期用途时。为此,只需保留 tagstags_and_args 未设置以获得默认值(一组空标签)。

如果同一模块需要其图的多个版本,例如,在训练模式下应用 dropout 的训练版本,以及使 dropout 成为空操作的推理版本,则需要标签。您通常会看到类似

的代码
def module_fn(training):
  inputs = tf.placeholder(dtype=tf.float32, shape=[None, 50])
  layer1 = tf.layers.fully_connected(inputs, 200)
  layer1 = tf.layers.dropout(layer1, rate=0.5, training=training)
  layer2 = tf.layers.fully_connected(layer1, 100)
  outputs = dict(default=layer2)
  hub.add_signature(inputs=inputs, outputs=outputs)

...

tags_and_args = [(set(), {"training": False}),
                 ({"train"}, {"training": True})]
module_spec = hub.create_module_spec(module_fn, tags_and_args)

创建模块规范运行 module_fn for all 提供的参数指令,并存储 all 构建它们的图表场景。当您从该规范创建一个模块然后将其导出时,它将包含所有创建的图形版本,并用相应的字符串集标记。

m = hub.Module(...)tags=... 参数仅控制在当前图形中使用哪个不同的图形版本,例如,当调用 m 时(即应用于输入)。它不限制 m.export(...) 写出的内容。