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 图适合模块的所有预期用途时。为此,只需保留 tags
或 tags_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(...)
写出的内容。
我很困惑标签应该如何在集线器中工作以及在导出时如何使用它们。我如何在图表的火车部分进行训练并导出服务部分?
我有以下代码:
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 图适合模块的所有预期用途时。为此,只需保留 tags
或 tags_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(...)
写出的内容。