关键概念
使用模块
实例化模块
TensorFlow Hub模块通过从包含URL或文件系统路径的字符串中创建module对象来导入TensorFlow程序,例如:
这将模块的变量添加到当前的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函数一样从张量输入到张量输出被调用0次或更多次:
每次这样的调用都将操作添加到当前的TensorFlow图中进行计算y
从x
.如果这涉及到具有训练权重的变量,则这些变量将在所有应用程序之间共享。
模块可以定义多个命名签名,以允许以多种方式应用(类似于Python对象的方法)。模块的文档应该描述可用的签名。上面的调用应用名为“default”的签名。任何签名都可以通过将其名称传递给可选选项来选择签名=
论点。
如果一个签名有多个输入,它们必须作为dict传递,键由签名定义。同样地,如果一个签名有多个输出,可以通过在签名定义的键下传递as_dict=True来作为dict检索这些输出。(关键“默认”
是否为单个输出返回ifas_dict = FALSE
所以应用Module的最一般的形式是这样的:
输出< -米(列表(苹果=x1,橙子=x2),签名=“fruit_to_pet”,as_dict =真正的)日元=输出$猫y2 =输出$狗
调用方必须提供签名定义的所有输入,但不要求使用模块的所有输出。模块使用者应该优雅地处理额外的输出。
创建新模块
一般方法
集线器模块就是一个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)
使它的变量是可训练的,并导入TensorFlow的变量REGULARIZATION_LOSSES
.如果模块有多个图形变体,请确保选择适合训练的一个。通常,这是有标签的{“训练”}
.
选择一种不破坏预先训练的权重的训练方案,例如,比从头开始训练的学习率低。
出版商
为方便消费者进行微调,请注意以下事项:
微调需要规范化。方法导出模块
REGULARIZATION_LOSSES
收藏,这是什么放你的选择layer_dense(…,kernel_regularizer=...)
消费者从中得到什么特遣部队损失get_regularization_losses美元()
.更喜欢这样定义L1/L2正则化损失。方法定义L1/L2正则化,避免在发布者模型中使用
l1_
而且l2_regularization_strength
的参数特遣部队训练FtrlOptimizer美元
,特遣部队训练ProximalGradientDescentOptimizer美元
,以及其他近端优化器。它们不会随模块一起导出,并且全局设置正则化强度可能不适合使用者。除了宽(即稀疏线性)或宽深模型中的L1正则化之外,应该可以使用单独的正则化损失来代替。如果使用退出、批处理归一化或类似的训练技术,请将退出率和其他超参数设置为对许多预期用途都有意义的值。
托管模块
TensorFlow Hub支卡塔尔世界杯欧洲预选赛赛程表持基于HTTP的模块分发。特别地,该协议允许使用标识模块的URL作为模块的文档和获取模块的端点。
协议
当URL如https://example.com/module
是用来识别一个模块加载或实例化,模块解析器将尝试下载压缩焦油球从URL后追加查询参数? 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. gz ./Pb ./variables/ ./variables/变量。数据- 00000 - 00001。/变量/变量。索引./assets/ ./saved_model.pb