我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Tensorflow2.4如何搭建单层和多层Bi-LSTM模型

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Tensorflow2.4如何搭建单层和多层Bi-LSTM模型

这篇文章主要介绍“Tensorflow2.4如何搭建单层和多层Bi-LSTM模型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Tensorflow2.4如何搭建单层和多层Bi-LSTM模型”文章能帮助大家解决问题。

前言

本文使用 cpu 版本的 TensorFlow 2.4 ,分别搭建单层 Bi-LSTM 模型和多层 Bi-LSTM 模型完成文本分类任务。

确保使用 numpy == 1.19.0 左右的版本,否则在调用 TextVectorization 的时候可能会报 NotImplementedError 。

实现过程

1. 获取数据

(1)我们本文用到的数据是电影的影评数据,每个样本包含了一个对电影的评论文本和一个情感标签,1 表示积极评论,0 表示负面评论,也就是说这是一份二分类的数据。

(2)我们通过 TensorFlow 内置的函数,可以从网络上直接下载 imdb_reviews 数据到本地的磁盘,并取出训练数据和测试数据。

(3)通过使用 tf.data.Dataset 相关的处理函数,我们将训练数据和测试数据分别进行混洗,并且设置每个 batch 大小都是 64 ,每个样本都是 (text, label) 的形式。如下我们取了任意一个 batch 中的前两个影评文本和情感标签。

import numpy as npimport tensorflow_datasets as tfdsimport tensorflow as tfimport matplotlib.pyplot as plttfds.disable_progress_bar()BUFFER_SIZE = 10000BATCH_SIZE = 64dataset, info = tfds.load('imdb_reviews', with_info=True, as_supervised=True)train_dataset, test_dataset = dataset['train'], dataset['test']train_dataset = train_dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)test_dataset = test_dataset.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)for example, label in train_dataset.take(1):    print('text: ', example.numpy()[:2])    print('label: ', label.numpy()[:2])

部分样本显示:

 text: [ 
     b"First of all, I have to say I have worked for blockbuster and have seen quite a few movies to the point its tough for me to find something I haven't seen. Taking this into account, I want everyone to know that this movie was by far the worst film ever made, it made me pine for Gigli, My Boss's Daughter, and any other piece of junk you've ever seen. BeLyt must be out of his mind, I've only found one person who liked it and even they couldn't tell me what the movie was about. If you are able to decipher this movie and are able to tell me what it was about you have to either be the writer or a fortune teller because there's any other way a person could figure this crap out.<br /><br />FOR THE LOVE OF G-D STAY AWAY!"
     b"Just got out and cannot believe what a brilliant documentary this is. Rarely do you walk out of a movie theater in such awe and amazement. Lately movies have become so over hyped that the thrill of discovering something truly special and unique rarely happens. Amores Perros did this to me when it first came out and this movie is doing to me now. I didn't know a thing about this before going into it and what a surprise. If you hear the concept you might get the feeling that this is one of those touchy movies about an amazing triumph covered with over the top music and trying to have us fully convinced of what a great story it is telling but then not letting us in. Fortunetly this is not that movie. The people tell the story! This does such a good job of capturing every moment of their involvement while we enter their world and feel every second with them. There is so much beyond the climb that makes everything they go through so much more tense. Touching the Void was also a great doc about mountain climbing and showing the intensity in an engaging way but this film is much more of a human story. I just saw it today but I will go and say that this is one of the best documentaries I have ever seen."
 ]
label:  [0 1]

2. 处理数据

(1)想要在模型中训练这些数据,必须将这些文本中的 token 都转换成机器可以识别的整数,最简单的方法就是使用 TextVectorization 来制作一个编码器 encoder,这里只将出现次数最多的 1000 个 token 当做词表,另外规定每个影评处理之后只能保留最长 200 的长度,如果超过则会被截断,如果不足则用填充字符对应的整数 0 补齐。

(2)这里展现出来了某个样本的经过整数映射止之后的结果,可以看到影评对应的整数数组长度为 200 。

MAX_SEQ_LENGTH = 200VOCAB_SIZE = 1000encoder = tf.keras.layers.experimental.preprocessing.TextVectorization(max_tokens=VOCAB_SIZE, output_sequence_length=MAX_SEQ_LENGTH)encoder.adapt(train_dataset.map(lambda text, label: text))vocab = np.array(encoder.get_vocabulary())encoded_example = encoder(example)[:1].numpy()print(encoded_example)print(label[:1])

随机选取一个样本进行证书映射结果:

[[ 86   5  32  10  26   6 130  10  26 926  16   1   3  26 108 176   4 164
   93   6   2 215  30   1  16  70   6 160 140  10 731 108 647  11  78   1
   10 178 305   6 118  12  11  18  14  33 234   2 240  20 122  91   9  91
   70   1  16   1  56   1 580   3  99  81 408   5   1 825 122 108   1 217
   28  46   5  25 349 195  61 249  29 409  37 405   9   3  54  35 404 360
   70  49   2  18  14  43  45  23  24 491   6   1  11  18   3  24 491   6
  360  70  49   9  14  43  23  26   6 352  28   2 762  42   4   1   1  80
  213  99  81  97   4 409  96 811  11 638   1  13  16   2 116   5   1 766
  242   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0]]
tf.Tensor([0], shape=(1,), dtype=int64)

3. 单层 Bi-LSTM 模型

(1) 第一层是我们刚才定义好的 encoder ,将输入的文本进行整数的映射。

(2)第二层是 Embedding 层,我们这里设置了每个词的词嵌入维度为 32 维。

(3)第三层是 Bi-LSTM 层,这里我们设置了每个 LSTM 单元的输出维度为 16 维。

(4)第四层是一个输出 8 维向量的全连接层,并且使用的 relu 激活函数。

(5)第五层是 Dropout ,设置神经元丢弃率为 0.5 ,主要是为了防止过拟合。

(6)第六层是一个输出 1 维向量的全连接层,也就是输出层,表示的是该样本的 logit 。

model = tf.keras.Sequential([    encoder,    tf.keras.layers.Embedding( input_dim=len(encoder.get_vocabulary()), output_dim=32, mask_zero=True),    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(16)),    tf.keras.layers.Dense(8, activation='relu'),    tf.keras.layers.Dropout(0.5),    tf.keras.layers.Dense(1)])

(7)在没有经过训练的模型上对文本进行预测,如果输出小于 0 则为消极评论,如果大于 0 则为积极评论,我们可以看出这条评论本来应该是积极评论,但是却输出的 logit 却是负数,即错误预测成了消极的。

sample_text = ('The movie was cool. The animation and the graphics were out of this world. I would recommend this movie.')model.predict(np.array([sample_text]))

预测结果为:

array([[-0.01437075]], dtype=float32)

array([[-0.01437075]], dtype=float32)

(8)我们使用 BinaryCrossentropy 作为损失函数,需要注意的是如果模型输出结果给到 BinaryCrossentropy 的是一个 logit 值(值域范围 [-&infin;, +&infin;] ),则应该设置 from_logits=True 。如果模型输出结果给到 BinaryCrossentropy 的是一个概率值 probability (值域范围 [0, 1] ),则应该设置为 from_logits=False 。

(9)我们使用 Adam 作为优化器,并且设置学习率为 1e-3 。

(10)我们使用准确率 accuracy 作为评估指标。

(11)使用训练数据训练 10 个 epoch,同时每经过一个 epoch 使用验证数据对模型进行评估。

model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),              optimizer=tf.keras.optimizers.Adam(1e-3),              metrics=['accuracy'])history = model.fit(train_dataset, epochs=10,  validation_data=test_dataset, validation_steps=30)

训练过程如下:

Epoch 1/10391/391 [==============================] - 30s 65ms/step - loss: 0.6461 - accuracy: 0.5090 - val_loss: 0.4443 - val_accuracy: 0.8245Epoch 2/10391/391 [==============================] - 23s 58ms/step - loss: 0.4594 - accuracy: 0.6596 - val_loss: 0.3843 - val_accuracy: 0.8396...Epoch 10/10391/391 [==============================] - 22s 57ms/step - loss: 0.3450 - accuracy: 0.8681 - val_loss: 0.3920 - val_accuracy: 0.8417

(12)训练结束之后使用测试数据对模型进行测试,准确率可以达到 0.8319 。如果经过超参数的调整和足够的训练时间,效果会更好。

model.evaluate(test_dataset)

结果为:

391/391 [==============================] - 6s 15ms/step - loss: 0.3964 - accuracy: 0.8319

(13)使用训练好的模型对影评进行分类预测,可以看出可以正确得识别文本的情感取向。因为负数表示的就是影评为负面情绪的。

sample_text = ('The movie was not cool. The animation and the graphics were bad. I would not recommend this movie.')model.predict(np.array([sample_text]))

结果为:

array([[-1.6402857]], dtype=float32)

4. 多层 Bi-LSTM 模型

(1)我们上面只是搭建了一层的 Bi-LSTM ,这里我们搭建了两层的 Bi-LSTM 模型,也就是在第二层 Bidirectional 之后又加了一层 Bidirectional ,这样可以使我们的模型更加有效。我们使用的损失函数、优化器、评估指标都和上面一样。

model = tf.keras.Sequential([    encoder,    tf.keras.layers.Embedding(len(encoder.get_vocabulary()), 32, mask_zero=True),    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32,  return_sequences=True)),    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(16)),    tf.keras.layers.Dense(8, activation='relu'),    tf.keras.layers.Dropout(0.5),    tf.keras.layers.Dense(1)])model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), optimizer=tf.keras.optimizers.Adam(1e-3), metrics=['accuracy'])history = model.fit(train_dataset, epochs=10, validation_data=test_dataset,  validation_steps=30)

训练过程如下:

Epoch 1/10391/391 [==============================] - 59s 124ms/step - loss: 0.6170 - accuracy: 0.5770 - val_loss: 0.3931 - val_accuracy: 0.8135Epoch 2/10391/391 [==============================] - 45s 114ms/step - loss: 0.4264 - accuracy: 0.7544 - val_loss: 0.3737 - val_accuracy: 0.8380...Epoch 10/10391/391 [==============================] - 45s 114ms/step - loss: 0.3138 - accuracy: 0.8849 - val_loss: 0.4069 - val_accuracy: 0.8323

(2)训练结束之后使用测试数据对模型进行测试,准确率可以达到 0.8217 。如果经过超参数的调整和足够的训练时间,效果会更好。

model.evaluate(test_dataset)

结果为:

391/391 [==============================] - 14s 35ms/step - loss: 0.4021 - accuracy: 0.8217

(3)使用训练好的模型对影评进行分类预测,可以看出可以正确得识别文本的情感取向。因为正数表示的就是影评为积极情绪的。

sample_text = ('The movie was good. The animation and the graphics were very good. you should love movie.')model.predict(np.array([sample_text]))

结果为:

array([[3.571126]], dtype=float32)

关于“Tensorflow2.4如何搭建单层和多层Bi-LSTM模型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Tensorflow2.4如何搭建单层和多层Bi-LSTM模型

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Tensorflow2.4如何搭建单层和多层Bi-LSTM模型

这篇文章主要介绍“Tensorflow2.4如何搭建单层和多层Bi-LSTM模型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Tensorflow2.4如何搭建单层和多层Bi-LSTM模型”文章能帮
2023-07-04

Tensorflow2.4搭建单层和多层Bi-LSTM模型

这篇文章主要为大家介绍了Tensorflow2.4搭建单层Bi-LSTM模型和多层Bi-LSTM模型的实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-06

Django模型层如何实现多表关系创建和多表操作

本篇内容介绍了“Django模型层如何实现多表关系创建和多表操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言创建表关系多表数据操作
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录