基于 Transformer 模型的电影评论情感分类
基于 模型 分类 评论 transformer 电影 情感
2023-09-14 09:14:57 时间
# -*- coding: utf-8 -*-
"""论文代码
基于Transformer模型的电影评论感情分析
- 环境 tensorflow==2.7.0 GPU
numpy==1.19.5
matplotlib==3.2.2
"""
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
tf.__version__
tf.test.is_gpu_available()
"""# 一、数据集"""
# 只考虑频次最高的4000个单词作为整个词典
vocab_size = 4000
# 在imdb数据集中,对于每个电影仅考虑其评论的前200个单词
maxlen = 200
(x_train, y_train), (x_val, y_val) = keras.datasets.imdb.load_data(num_words=vocab_size)
# 将每个训练、测试样本序列补充为定长
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_val = keras.preprocessing.sequence.pad_sequences(x_val, maxlen=maxlen)
"""# 二、模型"""
# 定义Transformer层
class TransformerBlock(layers.Layer):
def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1):
super(TransformerBlock, self).__init__()
self.att = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)
self.ffn = keras.Sequential([layers.Dense(ff_dim, activation="relu"), layers.Dense(embed_dim),])
self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)
self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)
self.dropout1 = layers.Dropout(rate)
self.dropout2 = layers.Dropout(rate)
def call(self, inputs, training):
attn_output = self.att(inputs, inputs)
attn_output = self.dropout1(attn_output, training=training)
out1 = self.layernorm1(inputs + attn_output)
ffn_output = self.ffn(out1)
ffn_output = self.dropout2(ffn_output, training=training)
return self.layernorm2(out1 + ffn_output)
# 定义单词与位置编码层
class TokenAndPositionEmbedding(layers.Layer):
def __init__(self, maxlen, vocab_size, embed_dim):
super(TokenAndPositionEmbedding, self).__init__()
self.token_emb = layers.Embedding(input_dim=vocab_size, output_dim=embed_dim)
self.pos_emb = layers.Embedding(input_dim=maxlen, output_dim=embed_dim)
def call(self, x):
maxlen = tf.shape(x)[-1]
positions = tf.range(start=0, limit=maxlen, delta=1)
positions = self.pos_emb(positions)
x = self.token_emb(x)
return x + positions
# 定义每个样本序列的编码长度
embed_dim = 32
# 定义注意力头(Attention Head)的个数
num_heads = 2
# 定义Transformer层中前向传播网络里隐藏单元的个数
ff_dim = 32
# 定义整个模型的输入、输出和连接顺序
model = keras.Sequential([
TokenAndPositionEmbedding(maxlen, vocab_size, embed_dim),
TransformerBlock(embed_dim, num_heads, ff_dim),
layers.GlobalAveragePooling1D(),
layers.Dropout(0.3),
layers.Dense(20, activation="sigmoid"),
layers.Dropout(0.3),
layers.Dense(2, activation="softmax")
])
checkpoint_path = './checkpoint/min.{epoch:02d}-{val_loss:.2f}.ckpt'
def scheduler(epoch, lr):
if epoch < 10:
return lr
else:
return lr * tf.math.exp(-0.1)
callbacks = [
# 保存模型
tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, # 模型保存路径
save_weights_only=True,# 只保存权重和偏执
verbose=1, # 以进度条方式展示
period=1 #每1个周期(epoch)存一个文件
),
# 终止训练的回调函数
tf.keras.callbacks.EarlyStopping(monitor='val_loss',# 监控对象
patience=3),# 允许周期
# 超过3个周期,val_loss升高就停止,防止过拟合
# 调整学习率
tf.keras.callbacks.LearningRateScheduler(scheduler, verbose=0)]
"""# 三、模型训练与评估"""
# 编译及训练模型
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
history = model.fit(x_train, y_train, batch_size=128,epochs=10,validation_split=0.2,callbacks=callbacks)
model.summary()
import matplotlib.pyplot as plt
def show_train_history(train_history,train_metrics,val_metrics):
plt.plot(train_history[train_metrics])
plt.plot(train_history[val_metrics])
plt.title(f'Trian History {train_metrics}')
plt.ylabel(train_metrics)
plt.xlabel('epoch')
plt.legend(['trian','validation'],loc='upper left')
plt.show()
show_train_history(history.history,'loss','val_loss')
show_train_history(history.history,'accuracy','val_accuracy')
"""# 四、预测"""
model.evaluate(x_val,y_val,verbose=1) # 0是无,1是进度条,2是一个epoch一个
pre = model.predict(x_val)
pre[0]
import numpy as np
state = {1:'pos',0:'neg'}
state[np.argmax(pre[0])]
state[y_val[0]] # 1是积极
相关文章
- 基于LM324的音调放大电路
- 网络请求+基于Node.js的WebSocket
- 为什么基于树的模型在表格数据上仍然优于深度学习
- EMNLP2022 & 天津大学 | 基于Bert的无监督边界感知模型BABERT「中文序列标注」
- BP综述:自闭症中基于功能连接体的预测模型
- 基于python的OpenCV人脸录入模型
- 【拆机测评】英特尔基于FPGA的 IPU表现如何?
- 文档级关系抽取:基于结构先验产生注意力偏差SSAN模型
- R语言基于决策树的银行信贷风险预警模型|附代码数据
- [J. Med. Chem. | 论文简读] RELATION:基于结构的新药设计深度生成模型
- ACL 2022 | 基于长度感知注意机制的长度可控摘要模型
- 基于CelebA数据集的GAN模型-2
- ChatGPT 基于倾向性识别的续写模型
- 【干货书】基于模型的强化学习:使用python工具箱从数据到连续动作
- 基于c/c++的希尔排序与插入排序对比
- 原创 | QAV:基于大语言模型的智能体协作的基本原理及应用前景展望
- 零样本文本分类应用:基于UTC的医疗意图多分类,打通数据标注-模型训练-模型调优-预测部署全流程。
- 详解基于redis实现的四种常见的限流策略
- 全球首个基于区块链的贸易结算完成,这次威胁的又是哪一群人?
- Art of Illusion是一个用Java语言写成的基于GPL v2的开源三维建模和渲染软件,可以创建高质量的具有真实感的三维模型。它使用方便,可以对纹理和材料等效果进行编辑,可以产生具有真实感的图像。
- 基于Redis实现高效的三级联动(用redis实现三级联动)
- 基于Redis的高效内存模型设计与实现(内存模型redis)
- 使用Redis集群构建基于JWT的可扩展授权模型(redis集群jwt)
- 基于Redis的多读取队列设计实践(redis 队列 多读取)
- 谁发明了基于内存事务的Redis(redis谁发明)
- 小蚁发布3D VR相机YI HALO,基于谷歌Jump平台,售价1.7万美元
- 基于mysql的论坛(4)
- 基于jquery的用鼠标画出可移动的div
- 基于java中子类的继承性的应用介绍
- 基于PHP文件操作的详解
- 基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码