0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用TensorFlow Hub文本模块构建一个模型,以根据相关描述预测电影类型

Tensorflowers 来源:未知 作者:李倩 2018-09-07 17:13 次阅读

将迁移学习应用于计算机视觉模型的例子很常见,但如果将其用于文本分类,情况又会如何呢?不妨进入TensorFlow Hub,这是通过迁移学习来增强 TF 模型的内容库。迁移学习是这样一种过程:选用已借助大量数据训练好的已有模型的权重和变量,并将其运用于自己的数据和预测任务。

迁移学习具有诸多好处,其中之一就是您无需像从头开始训练时一样提供自己的大量训练数据。但这些已有模型又来自何处呢?这正是 TensorFlow Hub 大显身手之处:它可以为各类模型(图像、文本等)提供现有模型检查点的完整存储区。在本篇博文中,我将介绍如何使用 TensorFlow Hub 文本模块构建一个模型,以根据相关描述预测电影类型。

您可以使用Colab在浏览器中运行此模型,无需任何设置。

导入数据并进行预处理

在这个模型中,我们将使用Kaggle 电影数据集这个出色的公共领域资源。该数据集包含逾 45000 部电影的数据,每部电影均有大量相关数据。为简便起见,我们仅使用该数据集中的电影描述(称作 “简介”)和电影类型。下面是该数据集在 Kaggle 中的预览:

注:Kaggle 电影数据集链接

https://www.kaggle.com/rounakbanik/the-movies-dataset/home

首先,我们将导入要使用的内容库,以构建此模型:

1import numpy as np

2import pandas as pd

3

4import tensorflow as tf

5import tensorflow_hub as hub

6

7from sklearn.preprocessing import MultiLabelBinarizer

我已经将这个数据集的 CSV 文件放在一个公共 Cloud Storage 存储分区中。我们可以运行如下命令,将数据下载到我们的 Colab 实例中,并读取为 Pandas dataframe 格式:

1!wget 'https://storage.googleapis.com/movies_data/movies_metadata.csv'

2data = pd.read_csv('movies_metadata.csv')

3

4descriptions = data['overview']

5genres = data['genres']

为简便起见,我们将可能的类型限定为下列几种:

1top_genres = ['Comedy', 'Thriller', 'Romance', 'Action', 'Horror', 'Crime', 'Documentary', 'Adventure', 'Science Fiction']

我们将数据集限定为这些类型中描述非空白的电影,然后按照 80% 训练和 20% 测试的比例将数据划分为训练数据集和测试数据集:

1train_size = int(len(descriptions) * .8)

2

3train_descriptions = descriptions[:train_size]

4train_genres = genres[:train_size]

5

6test_descriptions = descriptions[train_size:]

7test_genres = genres[train_size:]

使用 TF Hub 构建嵌入层

以 TF Hub 创建嵌入层时仅需使用极少量代码。我们的模型仅有一个特征(描述),并将表示为一个嵌入列。文本嵌入提供了在向量空间表示文本内容的方法,如此一来,嵌入空间中相似的字词或句子会更靠近(您可在此处阅读更多相关内容)。您可以完全使用自己的数据从头开始构建文本嵌入向量。TF Hub 可提供已使用各种文本数据训练过的文本嵌入,因而能够简化这一过程。

注:文本嵌入链接

https://www.tensorflow.org/hub/modules/text

对于英文文本,TF Hub 提供了各种已使用不同种类文本数据训练过的嵌入:

通用语句编码器 (Universal sentence encoder):用于较长的文本输入

ELMo:使用十亿单词基准 (1B Word Benchmark) 训练过的深度嵌入

神经网络语言模型 (Neural Network Language Model)嵌入:通过 Google 新闻训练

Word2vec:通过 Wikipedia 训练

您所选择的预训练文本嵌入是您模型中的一个超参数,所以最好用不同的文本嵌入进行试验,看看哪个的准确性最高。先从用与您的文本最接近的文本训练过的模型开始。由于我们的电影描述都是较长的输入,因此,我发现使用通用语句编码器嵌入的准确性最高。这可以将我们的描述编码为高维文本向量。请注意,这一特定模型很大,会占用 1GB 容量。

注:通用语句编码器链接

https://www.tensorflow.org/hub/modules/google/universal-sentence-encoder/2

我们可以使用 hub.text_embedding_column,以一行代码为该层创建一个特征列,并向其传递我们层的名称 (“movie_descriptions”) 和要使用的 TF Hub 模型网址:

1description_embeddings = hub.text_embedding_column(

2"movie_descriptions",

3module_spec="https://tfhub.dev/google/universal-sentence-encoder/2"

4)

请注意,该单元正在下载预训练过的嵌入,因此需要一些时间来运行。

此操作最大的好处在于,我们无需进行任何预处理,即可将文本描述馈送至预训练过的字词嵌入。如果从头开始构建此模型,我们就需要自己将描述转换为向量,但使用 TF Hub 列,我们可以将描述字符串直接传递至模型。

标签变为 multi-hot 编码

由于一部电影往往具有多种类型,所以我们的模型会为每部电影返回多个可能的标签。我们的类型目前是每部电影有一个字符串列表(例如 [‘Action’, ‘Adventure’])。由于每个标签的长度必须相同,所以我们要将这些列表转换为由 1 和 0(与特定描述中的类型相对应)组成的 multi-hot 向量。动作冒险片的 multi-hot 向量如下所示:

注:多个可能的标签链接

https://en.wikipedia.org/wiki/Multi-label_classification

1# Genre lookup, each genre corresponds to an index

2top_genres = ['Comedy', 'Thriller', 'Romance', 'Action', 'Horror', 'Crime', 'Documentary', 'Adventure', 'Science Fiction']

3

4# Multi-hot label for an action and adventure movie

5[0 0 0 1 0 0 0 1 0]

要用短短几行代码将字符串标签转换为 multi-hot 向量,我们需要使用名为 MultiLabelBinarizer 的 Scikit Learn 实用程序:

1encoder = MultiLabelBinarizer()

2encoder.fit_transform(train_genres)

3train_encoded = encoder.transform(train_genres)

4test_encoded = encoder.transform(test_genres)

5num_classes = len(encoder.classes_)

您可以打印 encoder.classes_,查看模型预测的所有字符串类列表。

构建并训练 DNNEstimator 模型

针对我们的模型,我们将使用 DNNEstimator 构建能够返回 multi-hot 向量的深度神经网络,这是因为每部电影会具有 0 个或多个可能的标签(这与每个输出正好有一个标签的模型不同)。我们传递至 DNNEstimator 的第一个参数称作 head,且此参数会定义我们的模型预期具有的标签类型。我们希望我们的模型可以输出多个标签,所以我们在这里使用 multi_label_head:

1multi_label_head = tf.contrib.estimator.multi_label_head(

2num_classes,

3loss_reduction=tf.losses.Reduction.SUM_OVER_BATCH_SIZE

4)

现在,当我们实例化 DNNEstimator 时,便可对其进行传递。hidden_units 参数表示我们网络中的层数。此模型有 2 个层,第一层有 64 个神经元,第二层有 10 个。层数和层大小是超参数,所以您应当尝试不同的值,看看哪个最适合您的数据集。最后,我们将特征列传递至估算器。在本例中,我们只有一个特征列(即描述),而且在上文中已将其定义为 TF Hub 嵌入列,所以在此我们可以将其作为列表传递:

1estimator = tf.contrib.estimator.DNNEstimator(

2head=multi_label_head,

3hidden_units=[64,10],

4feature_columns=[description_embeddings]

5)

我们基本准备就绪,很快就可以开始训练模型了。在训练估算器实例之前,我们需要定义训练输入函数。输入函数可以将我们的数据与模型联系起来。在这里,我们将使用 numpy_input_fn,并将我们的数据作为 Numpy 数组馈送至模型:

1# Format our data for the numpy_input_fn

2features = {

3"descriptions": np.array(train_descriptions)

4}

5labels = np.array(train_encoded)

6

7train_input_fn = tf.estimator.inputs.numpy_input_fn(

8features,

9labels,

10shuffle=True,

11batch_size=32,

12num_epochs=20

13)

我们输入函数中的 batch_size 和 num_epochs 参数都是超函数。batch_size 可告知我们的模型在一次迭代中会有多少示例传递至模型,而 num_epochs 是指我们的模型完成整个训练集的次数。

现在可以开始训练我们的模型了。只用一行代码即可:

1estimator.train(input_fn=train_input_fn)

为了评估模型的准确性,我们用自己的测试数据创建一个 eval 函数 input_function,然后调用 estimator.evaluate():

1eval_input_fn = tf.estimator.inputs.numpy_input_fn({"descriptions": np.array(test_descriptions).astype(np.str)}, test_encoded.astype(np.int32), shuffle=False)

2

3estimator.evaluate(input_fn=eval_input_fn)

此模型的 AUC 达到 91.5%,而查准率/查全率为 74%。您的结果可能稍有不同。

使用我们已训练的模型生成预测结果

现在到了最精彩的部分:根据我们的模型从未见过的数据生成预测结果。首先,我们设置一个包含一些描述的数组(我从 IMDB 中获取这些描述):

1raw_test = [

2"An examination of our dietary choices and the food we put in our bodies. Based on Jonathan Safran Foer's memoir.", # Documentary

3"A teenager tries to survive the last week of her disastrous eighth-grade year before leaving to start high school.", # Comedy

4"Ethan Hunt and his IMF team, along with some familiar allies, race against time after a mission gone wrong." # Action, Adventure

5]

然后,我们定义预测输入函数并调用 predict():

1predict_input_fn = tf.estimator.inputs.numpy_input_fn({"descriptions": np.array(raw_test).astype(np.str)}, shuffle=False)

2

3results = estimator.predict(predict_input_fn)

最后,我们可以迭代访问结果,并显示为每部电影找到的前 2 个类型及其置信度值:

1for movie_genres in results:

2top_2 = movie_genres['probabilities'].argsort()[-2:][::-1]

3for genre intop_2:

4text_genre = encoder.classes_[genre]

5print(text_genre + ': ' + str(round(movie_genres['probabilities'][genre] * 100, 2)) + '%')

我们的模型能够正确标记上述所有电影描述。

使用入门

想用 TF Hub 开始构建自己的模型吗?请参阅此文档和教程。您可以在GitHub或Colab上找到本文所述的完整模型代码。在之后的博文中,我会介绍如何导出此模型,以用于 TensorFlow Serving 或 Cloud ML Engine,并构建可根据新描述生成预测结果的应用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据集
    +关注

    关注

    4

    文章

    1178

    浏览量

    24351
  • tensorflow
    +关注

    关注

    13

    文章

    313

    浏览量

    60242
  • 迁移学习
    +关注

    关注

    0

    文章

    72

    浏览量

    5501

原文标题:使用 TensorFlow Hub 和估算器构建文本分类模型

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何使用TensorFlow构建机器学习模型

    在这篇文章中,我将逐步讲解如何使用 TensorFlow 创建一个简单的机器学习模型
    的头像 发表于 01-08 09:25 360次阅读
    如何使用<b class='flag-5'>TensorFlow</b><b class='flag-5'>构建</b>机器学习<b class='flag-5'>模型</b>

    关于 TensorFlow

    的灵活性TensorFlow 不是严格的“神经网络”库。只要你可以将你的计算表示为数据流图,你就可以使用
    发表于 03-30 19:57

    情地使用Tensorflow吧!

    预测模型的结构,将这个结构和目标函数(objective function)结合在起,并添加数据,Tensorflow将自动为你计算相关
    发表于 07-22 10:13

    TensorFlow XLA加速线性代数编译器

    依赖项对GPU版本,需要NVIDIA软件包支持TensorFlow配置安装。在这步中,需要选择不同的选项,如 XLA、Cuda 支持、Verbs 等:./configure
    发表于 07-28 14:31

    浅谈深度学习之TensorFlow

    神经网络和深度学习的概念,但为了完整起见,我们将在这里介绍基础知识,并探讨 TensorFlow 的哪些特性使其成为深度学习的热门选择。神经网络是生物启发式的计算和学习模型。像生物
    发表于 07-28 14:34

    TensorFlow实现多元线性回归(超详细)

    随着训练过程的进行而减少: 本节使用了 13 特征来训练模型。简单线性回归和多元线性回归的主要不同在于权重,且系数的数量始终等于输入特征的数量。下图为所构建的多元线性回归模型的 Te
    发表于 08-11 19:35

    高阶API构建模型和数据集使用

    能拟合或逼近现实世界中事物或现象的数学模型,故样本数据大,可以覆盖事物或现象所有特征时,可以越准确的识别事物,这也是大数据时代,数据是燃料的观点。TensorFlow神经网络软件
    发表于 11-04 07:49

    用tflite接口调用tensorflow模型进行推理

    摘要本文为系列博客tensorflow模型部署系列的部分,用于实现通用模型的部署。本文主要实现用tflite接口调用tensorflow
    发表于 12-22 06:51

    在Ubuntu 18.04 for Arm上运行的TensorFlow和PyTorch的Docker映像

    。build.sh 脚本构建图像并有帮助标志来查看选项。build-type 标志用于指定要构建的特定图像集。查看脚本和目录查看
    发表于 10-14 14:25

    如何构建文本生成器?如何实现马尔可夫链实现更快的预测模型

    Compose,聊天机器人都是应用的例子,本文将使用马尔可夫链构建文本生成器。这将是
    发表于 11-22 15:06

    自回归滞后模型进行多变量时间序列预测案例分享

    1、如何建立模型来进行多元时间序列预测呢?  下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒
    发表于 11-30 15:33

    LabVIEW进行癌症预测模型研究

    病例和癌症相关死亡人数有所增加。其中,乳腺癌是女性中最常见的癌症类型。 本研究采用ML技术对乳腺癌进行预测,比较了当前方法和提出的方法。 使用诊断乳腺癌数据集包含699样本,9
    发表于 12-13 19:04

    基于微博文本的词对主题演化模型

    具体描述时间维度上的主题动态演化,同时在文档中构成主题共享的词对结构,扩充了短文本特征。采用Gibbs采样方法对BToT参数进行估计,根据获得的主题一时间分布参数对主题进行演化分析。在真实微博数据集上进行验证,结果表明,BToT
    发表于 12-03 11:31 14次下载
    基于微博<b class='flag-5'>文本</b>的词对主题演化<b class='flag-5'>模型</b>

    训练一个机器学习模型,实现了根据基于文本分析预测葡萄酒质量

    我们可以把上述的其他信息也引入作为特征参数,这样就能构建出一个更全面的模型预测葡萄酒质量。为了将文字描述与其他特征结合起来进行预测,我们可
    的头像 发表于 05-16 18:27 5723次阅读

    TensorFlow再填新功能!谷歌宣布推出TensorFlow.Text

    TensorFlow一直以来致力于为用户提供更广泛的选择,帮助用户利用图像和视频数据构建模型。但是,许多模型是以文本开头的,从这些模型
    的头像 发表于 06-15 09:49 3039次阅读