使用tfhub转移学习

    本教程根据影评文本将影评分为正面或负面。这是一个二元或两类分类的例子,这是一个重要的和广泛应用的机器学习问题。

    我们将使用IMDB数据集里面有5万篇电影评论的文本互联网电影数据库.它们被分成25000个用于培训的评审和25000个用于测试的评审。训练和测试集是平衡的,这意味着它们包含相同数量的正面和负面评价。

    我们将使用Keras建立和训练模型和tfhub学习为转移。我们还会用到tfds加载IMDB数据集。

    让我们开始并加载所需的库。

    图书馆(keras)图书馆(tfhub)图书馆(tfds)图书馆(tfdatasets)

    下载IMDB数据集

    IMDB数据集已在imdb评论或在tfds.随Keras打包的软件包已经经过预处理,因此它对本教程没有用处。

    以下代码将IMDB数据集下载到您的机器:

    imdb < -tfds_load“imdb_reviews: 1.0.0”分=列表“火车(60%):““火车-40%:““测试”),as_supervised =真正的总结(imdb)
    ##──大型电影评论数据集。这是一个二进制情感分类数据集,包含##❯名称:imdb_reviews ##❯版本:1.0.0 ##❯url: http://ai.stanford.edu/~amaas/data/sentiment/
    注册的S3方法被'R.oo'覆盖
    ##❯Size: 80.2 MiB ##❯parted: ## - test(25000个示例)## - train(25000个示例)## - unsupervised(50000个示例)##❯Schema: ## - label [] INT ## - text [] BYTES

    tfds_load返回一个TensorFlow数据集,一个表示元素序列的抽象,其中每个元素由一个或多个组件组成。

    要访问数据集的单个元素,可以使用:

    第一个< -imdb [[1]]% > %dataset_batch1% > %#用于只获取第一个示例网状::as_iterator()% > %网状::iter_next()str(第一个)
    ##列表2 ## $:tf。这绝对是一部糟糕透顶的电影。别被克里斯托弗·沃肯或迈克尔·艾恩赛德骗了。他们都是伟大的演员,但这肯定是他们历史上最糟糕的角色。即使他们出色的演技也无法弥补这部电影荒谬的故事情节。这部电影是90年代早期美国的宣传片。最可悲的场景是哥伦比亚叛军为他们的革命辩护的时候。玛丽亚·肯奇塔·阿隆索看起来很虚伪,她和沃肯的假恋情只是电影中一个可怜的情感插科打诨,没有任何真正的意义。我很失望有这样的电影,毁了像克里斯托弗·沃肯这样的演员的好名声。我几乎坐不下去了。"], shape=(1,), dtype=string) ## $ :tf.Tensor([0], shape=(1,), dtype=int64)

    接下来我们将看到,Keras知道如何从TensorFlow数据集中自动提取元素,这比在传递给Keras之前将整个数据集加载到RAM中要高效得多。

    构建模型

    神经网络是通过堆叠层创建的——这需要三个主要的架构决策:

    1. 如何表示文本?
    2. 在模型中使用多少层?
    3. 每个图层使用多少隐藏单位?

    在本例中,输入数据由句子组成。要预测的标签是0或1。

    表示文本的一种方法是将句子转换为嵌入向量。我们可以使用预先训练好的文本嵌入作为第一层,它有三个优点:*我们不用担心文本预处理,*我们可以受益于迁移学习,*嵌入有固定的大小,所以处理起来更简单。

    对于本例,我们将使用一个预先训练的文本嵌入模型TensorFlow中心被称为谷歌/ tf2-preview / gnews-swivel-20dim / 1

    为了本教程的目的,还需要测试其他三个预先训练的模型:

    让我们首先创建一个Keras层,它使用TensorFlow Hub模型来嵌入句子,并在几个输入示例上进行测试。注意,无论输入文本的长度如何,嵌入的输出形状都是:(num_examples embedding_dimension)

    embedding_layer < -layer_hub处理=“https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1”embedding_layer(第一个[[1]])
    # #特遣部队。张量(## [[1.765786 -3.882232 3.9134233 -1.5557289 -3.3362343 -1.7357955 ## -1.9954445 1.2989551 5.081598 -1.1041286 -2.0503852 -0.72675157 ## -0.65675956 0.24436149 -3.7208383 2.0954835 2.2969332 -2.0689783 ## -2.9489717 -1.1315987]],shape=(1,20), dtype=float32)

    现在让我们构建完整的模型:

    # #模型:“顺序 " ## ___________________________________________________________________________ ## 输出层(类型)的形状参数  # ## =========================================================================== ## keras_layer_1 (KerasLayer)(没有,20)400020  ## ___________________________________________________________________________ ## 密度(密度)336(没有,16)  ## ___________________________________________________________________________ ## dense_1(致密)(没有,1) 17  ## =========================================================================== ## 总参数:400373 # #可训练的参数:400373 # # Non-trainable参数:0  ## ___________________________________________________________________________

    这些层按顺序堆叠以构建分类器:

    1. 第一层是TensorFlow Hub层。这一层使用预先训练的Saved Model将一个句子映射到它的嵌入向量。我们使用的预训练文本嵌入模型(谷歌/ tf2-preview / gnews-swivel-20dim / 1)将句子分成标记,嵌入每个标记,然后结合嵌入。得到的维度是:(num_examples, embedding_dimension)。
    2. 这个固定长度的输出矢量通过管道通过一个具有16个隐藏单元的全连接(致密)层。
    3. 最后一层与单个输出节点紧密连接。使用sigmoid激活函数,该值是0到1之间的一个浮点数,表示概率或置信度。

    让我们编译模型。

    损失函数和优化器

    一个模型需要一个损失函数和一个训练优化器。由于这是一个二元分类问题,并且模型输出一个概率(具有sigmoid激活的单个单元层),因此我们将使用binary_crossentropy损失函数。

    这并不是损失函数的唯一选择,例如,您可以选择mean_squared_error。但是,一般来说,binary_crossentropy更适合于处理概率——它度量概率分布之间的“距离”,或者在我们的例子中,度量基本真理分布和预测之间的“距离”。

    稍后,当我们探索回归问题(比如,预测房子的价格)时,我们将看到如何使用另一个损失函数,称为均方误差。

    现在,配置模型使用优化器和损失函数:

    火车模型

    在512个样本的小批次中训练模型的20个epoch。这是对数据集中所有样本的20次迭代。在训练时,监控模型在验证集中的10,000个样本上的损失和准确性:

    # #时代1/20 # # 30/30 - 3 s损失:0.8245 -准确性:0.5371 - val_loss: 0.0000 e + 00 - val_accuracy: 0.0000 e + 00 # #时代2/20 # # 30/30 - 2 s损失:0.6803 -准确性:0.5983 - val_loss: 0.6597 - val_accuracy: 0.6131 # #时代3/20 # # 30/30 - 2 s损失:0.6277 -准确性:0.6553 - val_loss: 0.6107 - val_accuracy: 0.6708 # #时代4/20 # # 30/30 - 3 s损失:0.5771 -准确性:0.7061 - val_loss: 0.5655 - val_accuracy: 0.7175 # #时代5/20 # # 30/30 - 3 s损失:0.5298 -准确性:0.7503 - val_loss:0.5250 - 0.7506 val_accuracy: # #时代6/20 # # 30/30 - 3 s损失:0.4901 -准确性:0.7849 - val_loss: 0.4887 - val_accuracy: 0.7748 # #时代7/20 # # 30/30 - 3 s损失:0.4484 -准确性:0.8079 - val_loss: 0.4583 - val_accuracy: 0.7945 # #时代8/20 # # 30/30 - 4 s损失:0.4121 -准确性:0.8288 - val_loss: 0.4290 - val_accuracy: 0.8144 # #时代9/20 # # 30/30 - 3 s损失:0.3824 -准确性:0.8455 - val_loss: 0.4071 - val_accuracy: 0.8246 # #时代10/20 # # 30/30 - 3 s损失:0.3523 - 0.8587精度:- val_loss: 0.3852 - val_accuracy: 0.8376 # #时代11/20 # # 30/30 - 3 s损失:0.3263 -准确性:0.8709 - val_loss: 0.3682 - val_accuracy: 0.8442 # #时代12/20 # # 30/30 - 3 s损失:0.3019 -准确性:0.8829 - val_loss: 0.3539 - val_accuracy: 0.8496 # #时代13/20 # # 30/30 - 3 s损失:0.2847 -准确性:0.8923 - val_loss: 0.3458 - val_accuracy: 0.8512 # #时代14/20 # # 30/30 - 3 s损失:0.2622 -准确性:0.9007 - val_loss: 0.3320 - val_accuracy:0.8591 # #时代15/20 # # 30/30 - 3 s损失:0.2476 -准确性:0.9111 - val_loss: 0.3236 - val_accuracy: 0.8625 # #时代16/20 # # 30/30 - 3 s损失:0.2309 -准确性:0.9167 - val_loss: 0.3175 - val_accuracy: 0.8663 # #时代17/20 # # 30/30 - 3 s损失:0.2145 -准确性:0.9230 - val_loss: 0.3130 - val_accuracy: 0.8677 # #时代18/20 # # 30/30 - 3 s损失:0.2023 -准确性:0.9288 - val_loss: 0.3086 - val_accuracy: 0.8698 # #时代19/20 # # 30/30 - 3 s损失:0.1894 -精度:0.9349 - val_loss: 0.3057 - val_accuracy: 0.8711 ##纪元20/20 ## 30/30 - 3s -损耗:0.1804 -精度:0.9382 - val_loss: 0.3037 - val_accuracy: 0.8724

    评估模型

    让我们看看模型的表现。将返回两个值。损失(一个代表我们错误的数字,数值越低越好)和准确性。

    模型% > %评估(imdb [[3.]]% > %dataset_batch512),verbose =0
    # # # #[1]美元损失精度0.3144187 # # # # # # 0.86488 [1]

    这种相当简单的方法的准确率约为87%。使用更先进的方法,模型应该接近95%。