0

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

我有以下代码:

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")

我的问题如下:由于我将模块实例化为mwith tags={'train'},我认为我正在使用正确的模块进行培训。这是否意味着我导出带有 标记的那个train?我如何使用train训练和set()(默认)服务?

4

1 回答 1

1

在最好的(即最简单的)情况下,您的模块根本不需要任何标签,即当同一块 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,并存储在幕后构建的所有图表。当您根据该规范创建一个模块然后导出它时,它将包含所有创建的图形版本,并用相应的字符串集进行标记。

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

于 2018-06-06T15:53:23.273 回答