关键概念
使用一个模块
实例化一个模块
TensorFlow Hub模块被导入到TensorFlow程序中,方法是用一个带有URL或文件系统路径的字符串创建一个module对象,例如:
这会将模块的变量添加到当前的TensorFlow图中。
高速缓存模块
当从URL创建模块时,模块内容被下载并缓存在本地系统临时目录中。缓存模块的位置可以使用TFHUB_CACHE_DIR环境变量来重写。
例如,设置TFHUB_CACHE_DIR
来/ my_module_cache
:
Sys.setenv(TFHUB_CACHE_DIR =“/ my_module_cache”)
然后从URL创建一个模块:
m < -hub_load(“https://tfhub.dev/google/progan-128/1”)
结果是下载模块并将其解包到/ my_module_cache
.
应用模块
一旦实例化,模块m可以像Python函数一样从张量输入到张量输出调用零次或多次:
每个这样的调用都将操作添加到当前的TensorFlow图中进行计算y
从x
.如果这涉及到带有训练权重的变量,那么这些变量将在所有应用程序之间共享。
模块可以定义多个命名签名,以便允许以一种以上的方式应用(类似于Python对象的方法)。模块的文档应该描述可用的签名。上面的调用应用名为“default”的签名。可以通过将签名的名称传递给可选项来选择任何签名签名=
论点。
如果一个签名有多个输入,它们必须作为一个字典传递,密钥由签名定义。同样地,如果一个签名有多个输出,可以通过在签名定义的键下传递as_dict=True作为一个字典来检索。(关键“默认”
对于单个输出返回,如果as_dict = FALSE
因此,应用模块的最一般形式如下:
输出< -米(列表(苹果=x1,橙子=x2),签名=“fruit_to_pet”,as_dict =真正的)日元=输出$猫y2 =输出$狗
调用者必须提供由签名定义的所有输入,但不要求使用模块的所有输出。模块消费者应该优雅地处理额外的输出。
创建新模块
一般方法
Hub模块只是一个SavedModel格式的TensorFlow图。为了创建一个模块,你可以运行export_savedmodel
函数使用任何TensorFlow对象。
例如:
图书馆(keras)mnist < -dataset_mnist()输入< -layer_input(形状(28,28),dtype =“int32”)输出< -输入% > %layer_flatten()% > %layer_lambda(tensorflow::tf_function(函数(x)特遣部队$投(x,特遣部队$float32)/255))% > %layer_dense(单位=10,激活=“softmax”)模型< -keras_model(输入、输出)模型% > %编译(损失=“sparse_categorical_crossentropy”,优化器=“亚当”,指标=“acc”)模型% > %适合(x =mnist$火车$x,y =mnist$火车$y,validation_split =0.2,时代=1)save_model_tf(模型中,“my_module /”,include_optimizer =假)
在将模型导出为SavedModel格式之后,您可以使用它来加载它hub_load
,并使用它进行预测,例如:
模块< -hub_load(“my_module /”)预测< -模块(mnist$测验$x)% > %特遣部队$argmax(轴=1 l)的意思是(as.integer(预测)= =mnist$测验$y)
导出模块将其定义及其会话中变量的当前状态序列化到传递的路径中。这可以在第一次导出模块时使用,也可以在导出经过微调的模块时使用。
模块发布者应该实现一个常见的签名在可能的情况下,使消费者可以方便地交换模块,并找到最适合自己问题的模块。
微调
将导入模块的变量与模型的变量一起训练称为微调。微调可以带来更好的质量,但也增加了新的复杂性。我们建议消费者在探索更简单的质量调整后再进行微调。
对于消费者来说
要启用微调,请使用实例化模块hub_module(…,火车able = TRUE)
使它的变量可训练并导入TensorFlowREGULARIZATION_LOSSES
.如果模块有多个图形变量,请确保选择一个适合训练的。通常是带标签的那个{“训练”}
.
选择一种不破坏训练前重量的训练方案,例如,比从头开始训练更低的学习率。
出版商
为方便消费者进行微调,请留意以下事项:
微调需要正规化。导出模块时使用
REGULARIZATION_LOSSES
收藏,所以你才会选择layer_dense(…,kernel_regularizer=...)
等等,变成消费者的消费来源特遣部队损失get_regularization_losses美元()
.喜欢用这种方式定义L1/L2正则化损耗。在发布者模型中,避免通过
l1_
而且l2_regularization_strength
的参数特遣部队训练FtrlOptimizer美元
,特遣部队训练ProximalGradientDescentOptimizer美元
,以及其他近端优化器。它们不会随模块一起导出,而且全局设置正则化强度可能不适合消费者。除了L1正则化在宽(即稀疏线性)或宽&深模型,应该可以使用个别正则化损失代替。如果您使用dropout、批处理规范化或类似的培训技术,请将dropout率和其他超参数设置为在许多预期使用中都有意义的值。
举办一个模块
TensorFlow Hub支卡塔尔世界杯欧洲预选赛赛程表持基于HTTP的模块分发。具体来说,该协议允许使用标识模块的URL作为模块的文档和端点来获取模块。
协议
当URL如https://example.com/module
是用来识别一个模块来加载或实例化,模块解析器将试图从URL下载一个压缩的tar球后附加一个查询参数? tf-hub-format =压缩
.
查询参数被解释为以逗号分隔的客户端感兴趣的模块格式列表。现在只有“压缩”
格式定义。
压缩格式表明客户端期望一个tar.gz
使用模块内容进行归档。存档文件的根是模块目录的根,应该包含一个模块,例如:
从导出的模块目录创建一个压缩模块。$ tar -cz -f module.tar.gz——owner=0——group=0 -C /tmp/export-module/检查压缩模块中的文件$ tar -tf module.tar.gz ./ ./tfhub_module。pb /变量/ /变量/变量。数据- 00000 - 00001。/变量/变量。指数。/资产/。/ saved_model.pb