当前位置: 首页 > news >正文

T06_RNN示例

加载数据

以IMDB影评数据为例,加载评论

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow import data
import warningswarnings.filterwarnings('ignore')

读取影评数据

df_train = pd.read_csv(r'D:\WebDownload\IMDB影评数据集\labeledTrainData.tsv',sep=r'\t')
df_test = pd.read_csv(r'D:\WebDownload\IMDB影评数据集\testData.tsv',sep=r'\t')

处理数据,testData数据需要将评分提取处理来,然后将大于等于7的设置为积极表示,最后将评论中的<br />替换掉

df_test['sentiment']=df_test.id 
df_test.sentiment = df_test.sentiment.map(lambda x: x.replace("\"","").split('_')[1])
df_test.sentiment = df_test.sentiment.map(lambda x: 1 if int(x)>=7 else 0)
df_test.review=df_test.review.map(lambda x : x.replace("<br />",""))
df_train.review=df_train.review.map(lambda x : x.replace("<br />",""))

制作单词表

根据评论中的单词制作单词表,然后将评论转换为单词编码

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencestokernizer = Tokenizer(num_words=1000)
tokernizer.fit_on_texts(df_train.review.tolist())df_train_review = tokernizer.texts_to_sequences(df_train.review.tolist())
df_test_review = tokernizer.texts_to_sequences(df_test.review.tolist())

训练模型

数据

将前面的数据转换为tf.data.Dataset

对于长度参差不齐的句子,人为设置一个阈值,对大于此长度的句子,选择截断部分单词,可以选择截去句首单词,也可以截去句末单词;对于小于此长度的句子,可以选择在句首或句尾填充。

db_train = data.Dataset.from_tensor_slices((pad_sequences(df_train_review,maxlen=80),df_train.sentiment))
db_test = data.Dataset.from_tensor_slices((pad_sequences(df_test_review,maxlen=80),df_test.sentiment))
db_train = db_train.shuffle(1000).batch(128,drop_remainder=True)
db_test = db_test.batch(128,drop_remainder=True)

网络模型

class MyRNN(keras.Model):def __init__(self,units):'''params:units RNN 状态向量长度 '''super(MyRNN,self).__init__()self.stat0=[tf.zeros([128,units]),tf.zeros([128,units])]self.stat1=[tf.zeros([128,units]),tf.zeros([128,units])]self.embeding = keras.layers.Embedding(1000,100,input_length=80)self.rnn_cell0 = keras.layers.LSTMCell(units,dropout=0.5)self.rnn_cell1 = keras.layers.LSTMCell(units,dropout=0.5)self.out_layer = keras.Sequential([keras.layers.Dense(units),keras.layers.Dropout(rate=0.5),keras.layers.ReLU(),keras.layers.Dense(1)])def call(self,inputs,training=None):X = inputsx=self.embeding(X)state0 = self.stat0state1 = self.stat1for word in tf.unstack(x,axis=1):out0,state0 = self.rnn_cell0(word,state0,training)out1,state1 = self.rnn_cell0(word,state1,training)x = self.out_layer(out1,training)prob = tf.sigmoid(x)return probmodel = MyRNN(64)
model.compile(optimizer=keras.optimizers.RMSprop(0.001),loss=keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
model.fit(db_train,epochs=20)

经过20轮的训练,精度达到了0.916,测试精度达到0.841

推荐使用keras的高级接口:

model = keras.Sequential([keras.layers.Embedding(1000,100,input_length=80),keras.layer.Flatten(),keras.layers.LSTM(64,return_sequences=True),keras.layers.LSTM(64),keras.layers.Dense(64,activation='relu'),keras.layers.Dropout(rate=0.5),keras.layers.Dense(1, activation='sigmoid'),
])
model.compile(optimizer=keras.optimizers.RMSprop(0.001),loss=keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
model.fit(db_train,epochs=20)

但上面代码执行的时要注意,如果是A卡环境,不能使用GPU加速,会报错(原因大概为:tensorflow检测到有GPU,LSTM/GRU底层默认会调用CudnnRNNv2,N卡环境才有CudnnRNNv2)。

使用预训练的词向量

使用预训练的 Word Embedding 模型来得到单词的表示方法,基于预训练模型的词向量相当于迁移了整个语义空间的知识,可以有效的缩短训练时间,还可以提高性能。

加载GloVe词向量

# 加载GloVe向量
def load_glove_vectors(glove_file):with open(glove_file, 'r', encoding='utf-8') as file:words = set()word_to_vec_map = {}for line in file:line = line.strip().split()curr_word = line[0]words.add(curr_word)word_to_vec_map[curr_word] = np.array(line[1:], dtype=np.float32)return words, word_to_vec_mapwords, word_to_vec_map = load_glove_vectors(r'D:\dwload\glove\glove.6B.100d.txt')
print("词汇量大小:", len(words))
print("向量维度:", word_to_vec_map['word'].shape)  # 示例输出一个单词的向量维度

构建Tokenizer

tokenizer = keras.preprocessing.text.Tokenizer(10000)
tokenizer.fit_on_texts(df_train.review.tolist())
imdn_word_index = tokenizer.word_indexfrom tensorflow.keras.preprocessing.sequence import pad_sequencesdf_train_review = tokenizer.texts_to_sequences(df_train.review.tolist())
df_test_review = tokenizer.texts_to_sequences(df_test.review.tolist())db_train = tf.data.Dataset.from_tensor_slices((pad_sequences(df_train_review,maxlen=100),df_train.sentiment.tolist()))
db_test = tf.data.Dataset.from_tensor_slices((pad_sequences(df_test_review,maxlen=100),df_test.sentiment.tolist()))
db_train = db_train.shuffle(1000).batch(128,drop_remainder=True)
db_test = db_test.batch(128,drop_remainder=True)

嵌入矩阵

根据GloVe向量和tokenizer的词索引,构建embedding_matrix

num_words = min(10000, len(imdn_word_index)) + 1
embedding_matrix = np.zeros((num_words, 100))  # 100是单词维度
for word, i in imdn_word_index.items():if i > 10000:breakembedding_vector = word_to_vec_map.get(word)if embedding_vector is not None:embedding_matrix[i] = embedding_vector

模型

这里对embeding进行修改,使用预训练的词向量;设置trainable=False,表示后边的训练过程不在对embeding进行训练。

class MyRNN(keras.Model):def __init__(self,units):'''params:units RNN 状态向量长度 '''super(MyRNN,self).__init__()self.stat0=[tf.zeros([128,units]),tf.zeros([128,units])]self.stat1=[tf.zeros([128,units]),tf.zeros([128,units])]self.embeding = keras.layers.Embedding(num_words,100,weights=[embedding_matrix],input_length=100,trainable=False)self.rnn_cell0 = keras.layers.GRUCell(units) # 使用GRUCellself.rnn_cell1 = keras.layers.GRUCell(units)self.out_layer = keras.Sequential([keras.layers.Dense(units),keras.layers.ReLU(),keras.layers.Dense(1)])def call(self,inputs,training=None):X = inputsx=self.embeding(X)state0 = self.stat0state1 = self.stat1for word in tf.unstack(x,axis=1):out0,state0 = self.rnn_cell0(word,state0,training)out1,state1 = self.rnn_cell0(word,state1,training)x = self.out_layer(out1,training)prob = tf.sigmoid(x)return prob
model = MyRNN(64)
model.compile(optimizer=keras.optimizers.RMSprop(0.001),loss=keras.losses.BinaryCrossentropy(),metrics=['accuracy'])
model.fit(db_train,epochs=30)
model.evaluate(db_test)

同过使用预训练词向量,训练速度明显提升;经过30轮的训练,训练精度达到了0.977,测试精度0.832(存在过拟合)。


文章转载自:

http://g2FDNOJT.mLffg.cn
http://Qir3Qly8.mLffg.cn
http://RGUCvGpS.mLffg.cn
http://qfaaRpW4.mLffg.cn
http://Q59jLNmJ.mLffg.cn
http://Mi8VZbRl.mLffg.cn
http://E097Jk7c.mLffg.cn
http://Cco7gHey.mLffg.cn
http://lToAiHEm.mLffg.cn
http://Wcl7Kyg7.mLffg.cn
http://ibRA8C85.mLffg.cn
http://FtYwXv4x.mLffg.cn
http://RijdGRIU.mLffg.cn
http://RDqBxbgw.mLffg.cn
http://K7tGxaKy.mLffg.cn
http://XqFtl0mz.mLffg.cn
http://id8evNL0.mLffg.cn
http://I63rfYfT.mLffg.cn
http://HZIsx0gK.mLffg.cn
http://LMcG7PXK.mLffg.cn
http://Gqktq26S.mLffg.cn
http://N3zRFow2.mLffg.cn
http://3fmtS7eT.mLffg.cn
http://vrnPVEPb.mLffg.cn
http://q2WCIJJQ.mLffg.cn
http://ViYABx9y.mLffg.cn
http://k5jKujDl.mLffg.cn
http://2wWiZkt2.mLffg.cn
http://TjUC8pKv.mLffg.cn
http://rdrdZnD9.mLffg.cn
http://www.dtcms.com/a/368411.html

相关文章:

  • 【Android】Room数据库的使用
  • CoolGuard风控系统配置评分卡、权重策略|QLExpress脚本
  • 【FastDDS】Layer Transport ( 02-Transport API )
  • 确保 SQL Server 备份安全有效的最佳实践
  • 盘点完今年CoRL最火的VLA论文,发现最强的机器人,竟是用“假数据”喂大的
  • 新闻丨重庆两江新区党工委副书记、管委会主任许宏球一行莅临华院计算考察指导
  • 基于YOLO目标检测模型的视频推理GUI工具
  • latex公式符号与字体
  • SQL Server事务隔离级别
  • SQL高效处理海量GPS轨迹数据:人员gps轨迹数据抽稀实战指南
  • 查询语言的进化:SQL之后,为什么是GQL?数据世界正在改变
  • 概念 | C标准库STL,C运行时库CRT
  • JAiRouter 配置文件重构纪实 ——基于单一职责原则的模块化拆分与内聚性提升
  • ZooKeeper架构深度解析:分布式协调服务的核心设计与实现
  • ResNet 迁移学习---加速深度学习模型训练
  • Django REST framework:SimpleRouter 使用指南
  • Vue3 频率范围输入失焦自动校验实现
  • 删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素
  • 代码随想录算法训练营第三天| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表
  • 结合机器学习的Backtrader跨市场交易策略研究
  • 前端开发vscode插件 - live server
  • 码农的“必修课”:深度解析Rust的所有权系统(与C++内存模型对比)
  • 【Python基础】 17 Rust 与 Python 运算符对比学习笔记
  • 云手机可以息屏挂手游吗?
  • 会话管理巅峰对决:Spring Web中Cookie-Session、JWT、Spring Session + Redis深度秘籍
  • 腾讯云大模型训练平台
  • iPhone17全系优缺点分析,加持远程控制让你的手机更好用!
  • 数据泄露危机逼近:五款电脑加密软件为企业筑起安全防线
  • 阿里云vs腾讯云按量付费服务器
  • DocuAI深度测评:自动文档生成工具如何高效产出规范API文档与数据库表结构文档?