python - Tensorflow 集线器标签和导出
问题描述
我很困惑标签应该如何在集线器中工作以及在导出时如何使用它们。如何在我的图表的火车部分进行训练并导出服务图表?
我有以下代码:
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
with 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,并存储在幕后构建的所有图表。当您根据该规范创建一个模块然后导出它时,它将包含所有创建的图形版本,并用相应的字符串集进行标记。
tags=...
参数仅控制在当前图中使用m = hub.Module(...)
哪些不同的图版本,例如,在m
调用时(即应用于输入)。它不限制m.export(...)
写出的内容。
推荐阅读
- php - 如何限制在页面中打印空行
- database - 从同一表的另一列动态填充一列值
- amazon-web-services - 带有 IAM 的 EC2 上的 S3:错误 NoCredentialProviders:链中没有有效的提供者。已弃用
- reactjs - 无法在 Windows 上使用 expo-cli 命令安装 React Native
- python - 简化以下方法
- maven - 从本地存储库打包 maven 工件
- html - 移动视图中的不同渲染和手动浏览器调整大小
- java - 我在使用 java 在 mysql 中插入值时遇到问题
- c# - WebException: The underlying connection was closed: The connection was closed unexpectedly
- haskell - 如何用(<*>)和pure来定义(*>)、(<*)?