https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIIgMNKMJkE4SP1oTZlsiKINz4gP61TTWOfzUTvcwVm51o02Bjutza4Q-D6n2kf2bLNP0ZSIORQ_3t4nuTmspSipcUcDkQy2OullJ8btVXFTPfVvxxfVuKsV7tnKKz1CfLoT4kratTYK8/s1600/ingredients.png
发布者:Josh Gordon,TensorFlow 开发者倡导者
在软件开发中,共享代码库的概念是如此基础,以至于我们很容易忽略它。作为程序员,库可以立即提高我们的效率。从某种意义上说,它们改变了编程的解决问题过程。使用库时,我们通常会将编程视为将构建块(或模块)连接在一起的过程。
机器学习开发者会使用什么样的库呢?当然,除了共享代码,我们还希望共享预训练模型。共享预训练模型可以让开发者将其定制到自己的领域,而无需访问用于最初训练模型的计算资源或数据。例如,NASNet 训练花费了数千个 GPU 小时。通过共享学习到的权重,模型开发者可以更轻松地让其他人重复使用和构建他们的工作。
|
可以通过 TensorFlow Hub 打包和共享的机器学习模型的“成分”。从某种意义上说,共享预训练模型除了共享架构本身,还共享了用于开发模型的计算时间和数据集。 |
正是这个为机器学习开发者提供库的想法激发了
TensorFlow Hub 的诞生,今天我们很高兴与社区分享它。TensorFlow Hub 是一个发布、发现和重复使用 TensorFlow 中机器学习模块部分的平台。模块指的是 TensorFlow 图中的一个自包含部分,以及它的权重,它可以在其他类似的任务中重复使用。通过重复使用模块,开发者可以使用更小的数据集训练模型,提高泛化能力,或者简单地加快训练速度。让我们看几个例子来具体说明。
图像重新训练
作为第一个例子,让我们看看一种你可以用来训练图像分类器的技术,它只需要少量训练数据。现代图像识别模型拥有数百万个参数,当然,从头开始训练一个模型需要大量标记数据和计算能力。使用一种称为
图像重新训练 的技术,你可以使用更少的数据和更少的计算时间来训练模型。以下是 TensorFlow Hub 中的示例。
# Download and use NASNet feature vector module.
module = hub.Module(
“https://tfhub.dev/google/imagenet/nasnet_large/feature_vector/1")
features = module(my_images)
logits = tf.layers.dense(features, NUM_CLASSES)
probabilities = tf.nn.softmax(logits)
基本思路是重复使用现有的图像识别模块从你的图像中提取特征,然后在这些特征之上训练一个新的分类器。如上所示,TensorFlow Hub 模块可以在构建 TensorFlow 图时从 URL(或文件系统路径)实例化。TensorFlow Hub 上有各种各样的
模块供你选择,包括各种版本的 NASNet、
MobileNet(包括最新的 V2)、Inception、ResNet 等。要使用模块,你需要
导入 TensorFlow Hub,然后将模块的 URL 复制粘贴到你的代码中。
|
TensorFlow Hub 上提供的一些图像 模块。 |
每个模块都有一个定义的接口,允许它以可替换的方式使用,而无需了解其内部结构。在这种情况下,这个模块有一个方法,你可以用它来检索预期的图像大小。作为开发者,你只需要提供一个正确形状的图像批次,并对它调用模块以检索特征表示。这个模块负责为你预处理你的图像,因此你可以直接从一批图像到特征表示一步到位。从这里,你可以在这些特征上学习一个线性模型,或其他类型的分类器。
在这种情况下,请注意我们使用的模块由 Google 托管,并且是版本化的(因此你可以依赖模块在你的实验中不会改变)。模块可以像普通的 Python 函数一样应用,以构建图的一部分。一旦导出到磁盘,模块就成为自包含的,可以被其他人使用,而无需访问用于创建和训练它的代码和数据(当然,你也可以发布这些)。
文本分类
让我们再看一个例子。想象一下,你想训练一个模型将电影评论分类为正面或负面,但你只有少量训练数据(例如,几百条正面和负面的电影评论)。由于你只有有限的示例,你决定利用一个词嵌入数据集,它之前在更大的语料库上进行了训练。以下是使用 TensorFlow Hub 的示例。
# Download a module and use it to retrieve word embeddings.
embed = hub.Module(“https://tfhub.dev/google/nnlm-en-dim50/1")
embeddings = embed([“The movie was great!”])
与之前一样,我们首先选择一个
模块。TensorFlow Hub 提供了各种文本模块供你探索,包括各种语言(EN、JP、DE 和 ES)的神经网络语言模型,以及在维基百科上训练的 Word2vec 和在 Google 新闻上训练的 NNLM 嵌入。
|
TensorFlow Hub 上共享的一些文本 模块。 |
在这种情况下,我们将使用一个词嵌入模块。上面的代码下载了一个模块,使用它来预处理一个句子,然后检索每个词元的嵌入。这意味着你可以直接从你的数据集中的一个句子到适合分类器的格式一步到位。模块负责对句子进行分词,以及其他逻辑,例如处理词汇表外的词语。预处理逻辑和嵌入都被封装在一个模块中,这使得更容易尝试各种词嵌入数据集,或者不同的预处理策略,而无需对代码进行大幅更改。
|
使用 TensorFlow Hub 的文本分类教程。 |
如果你想尝试一下,请使用这个
教程,它将带你体验并学习 TensorFlow Hub 模块如何与 TensorFlow Estimators 协同工作。
通用句子编码器
我们还共享了一个用于新事物的 TensorFlow Hub 模块!下面是一个使用通用句子编码器的示例。它是一个在各种数据集上训练的 *句子级* 嵌入模块(换句话说,是“通用的”)。它擅长的一些事情是语义相似性、自定义文本分类和聚类。
|
这个笔记本 展示了如何在任何可以嵌入句子的 TF-Hub 模块之上训练简单的二元文本分类器。 |
与图像重新训练一样,只需要少量标记数据就可以将模块适应到你的任务中。让我们在餐厅评论上尝试一下,例如。
# Use pre-trained universal sentence encoder to build text vector
review = hub.text_embedding_column(
“review”, “https://tfhub.dev/google/universal-sentence-encoder/1")
features = {
“review”: np.array([“this movie is a masterpiece”, “this movie was terrible”, …])
}
labels = np.array([[1], [0], …])
input_fn = tf.estimator.input.numpy_input_fn(features, labels, shuffle=True)
estimator = tf.estimator.DNNClassifier(hidden_units, [review])
estimator.train(input_fn, max_steps=100)
查看这个教程以了解更多信息。
其他模块
TensorFlow Hub 不仅仅是关于图像和文本分类。在网站上,你还可以找到一些用于渐进式 GAN 和 G
oogle Landmarks Deep Local Features 的
模块。
注意事项
使用 TensorFlow Hub 模块时,有一些重要的注意事项。首先,请记住模块包含可运行的代码。始终使用来自可信来源的模块。其次,与所有机器学习一样,
公平性是一个
重要 的考虑因素。我们上面展示的两个例子都利用了大型预训练数据集。当重复使用这样的数据集时,重要的是要注意它包含什么数据(以及是否存在任何现有的偏差),以及这些偏差如何影响你正在构建的产品及其用户。
下一步
我们希望你在项目中发现 TensorFlow Hub 有用!要开始使用,请访问
tensorflow.org/hub。如果你遇到任何错误,可以在 GitHub 上提交一个
问题。要保持联系,你可以关注
GitHub 项目,并在
Twitter 上关注 TensorFlow。感谢阅读!