TransformerEncoder影评测试

 

import os
import keras
import tensorflow as tf
from keras import layers
import numpy as np#加载数据
def load_data(data_dir):"""data_dir:train的目录或test的目录输出:X:评论的字符串列表y:标签列表(0,1)"""classes = ['pos', 'neg']X, y = [], []for idx, cls in enumerate(classes):# 拼接某个类别的目录cls_path = os.path.join(data_dir, cls)os.listdir()# os.listdir:函数只返回当前目录下的文件和文件夹名称,不包括子目录中的内容。for file in os.listdir(cls_path):# 拼接单个文件的目录(cls_path/file)file_path = os.path.join(cls_path, file)with open(file_path, encoding='utf-8') as f:X.append(f.read().strip())y.append(idx)return X, np.array(y)# input_size:输入样本的数量(词汇表大小)
# seq_len:表示序列的长度 (列的长度)
# embed_dim:表示词向量的维度(行的长度)
#Input Embedding和Positional Encoding
class PositionalEmbedding(layers.Layer): #PositionalEmbedding继承layers.Layerdef __init__(self, input_size, seq_len, embed_dim):super(PositionalEmbedding, self).__init__()self.seq_len = seq_len# 词嵌入self.tokens_embedding = layers.Embedding(input_size, embed_dim)# 位置嵌入self.positions_embedding = layers.Embedding(seq_len, embed_dim)def call(self, inputs, *args, **kwargs):# 生成位置idpositions = tf.range(0, self.seq_len, dtype='int32')te = self.tokens_embedding(inputs)pe = self.positions_embedding(positions)return te + pe# transformer-encoder
class TransformerEncoder(layers.Layer): #TransformerEncoder继承layers.Layerdef __init__(self, embed_dim, hidden_dim, num_heads, **kwargs):super(TransformerEncoder, self).__init__(**kwargs)# Multi-Head Attention层; num_heads 注意头的数量;key_dim 查询和键的每个注意力头的大小self.attention = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim)# Feed Forward层self.feed_forward = keras.Sequential([layers.Dense(hidden_dim, activation='relu'), #隐藏层layers.Dense(embed_dim)#输出层])# layernorm层self.layernorm1 = layers.LayerNormalization()self.layernorm2 = layers.LayerNormalization()def call(self, inputs, *args, **kwargs):# 计算Self-Attentionattention_output = self.attention(inputs, inputs)# 进行第一个Layer & Normff_input = self.layernorm1(inputs + attention_output)# Feed Forwardff_output = self.feed_forward(ff_input)# 进行第二个Layer & Normoutputs = self.layernorm2(ff_input + ff_output)return outputsdef train():# 超参数vocab_size = 20000 #词汇表seq_len = 180  #句子长度,超过会被截断batch_size = 64 #最大批次hidden_size = 1024 #全连接层维度embed_dim = 256 #词向量维度(每一个词,我们需要用多少位的向量表示)num_heads = 8 #多头8,也就是self-attion是8个# 加载数据X_train, y_train = load_data("C://Users//Administrator//Desktop//重要办公//gan//gan//aclImdb//train")X_test, y_test = load_data("C://Users//Administrator//Desktop//重要办公//gan//gan//aclImdb//test")#向量化 (Tokenizer分词算法是NLP大模型最基础的组件,基于Tokenizer可以将文本转换成独立的token列表,进而转换成输入的向量成为计算机可以理解的输入形式)vectorization = layers.TextVectorization(max_tokens=vocab_size,  #词表大小output_sequence_length=seq_len, #最大长度pad_to_max_tokens=True)# 构建词表vectorization.adapt(X_train)# tokenizeX_train = vectorization(X_train)X_test = vectorization(X_test)# 构建模型inputs = layers.Input(shape=(seq_len,)) #输入是180个词# 180*20000||20000*256  == 180*256 的数据形状x = PositionalEmbedding(vocab_size, seq_len, embed_dim)(inputs) #输入180个词,并且限制最大输入也就是180,超过就截切成180,180不够直接paddingx = TransformerEncoder(embed_dim, hidden_size, num_heads)(x)#对文本数据进行平均池化操作x = layers.GlobalAveragePooling1D()(x)x = layers.Dropout(0.5)(x)outputs = layers.Dense(1, activation='sigmoid')(x)#构建函数模型,只需要传入输入和输出model = keras.Model(inputs, outputs)model.summary()# 训练model.compile(loss='binary_crossentropy', metrics=['accuracy'])model.fit(X_train,y_train,epochs=20,batch_size=batch_size,validation_data=(X_test, y_test))if __name__ == '__main__':train()'''
TextVectorization 层将分三个阶段处理文本:
首先,移除标点符号,并将输入内容转换成小写。
接下来,将文本分割成单个字符串词的列表。
最后,使用已知词汇表将字符串映射为数字输出。我们在此处可以尝试一个简单的方法,即多热编码,只考虑评论中是否存在术语。
例如,假设层词汇表为 ['movie', 'good', 'bad'],而评论为 'This movie was bad.'。
我们会将其编码为 [1, 0, 1],其中存在 movie(第一个词汇)和 bad(最后一个词汇)。
'''#  训练数据目录 下载地址:http://ai.stanford.edu/~amaas/data/sentiment/
# - aclImdb
#     - test
#         - neg
#         - pos
#         - labeledBow.feat
#         - urls_neg.txt
#         - urls_pos.txt
#     - train
#         - neg
#         - pos
'''
这是一个电影影评数据集,neg中包含的评论是评分较低的评论,而pos中包含的是评分较高的评论。我们需要的数据分别是test里面的neg和pos,
以及train里面的neg和pos(neg表示negative,pos表示positive)。下面我们开始处理。
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/491701.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再探二分法

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读二分查找题目思路解法左闭右闭式写法左闭右开式写法 二分查找 题目 给定一个…

【Flutter/Android】运行到安卓手机上一直卡在 Running Gradle task ‘assembleDebug‘... 的终极解决办法

方法步骤简要 查看你的Flutter项目需要什么版本的 Gradle 插件: 下载这个插件: 方法一:浏览器输入:https://services.gradle.org/distributions/gradle-7.6.3-all.zip 方法二:去Gradle官网找对应的版本:h…

编码后的字符串lua

-- 长字符串 local long_string "你好你好你好你好你好你好你好你好" local encoded_string "" for i 1, #long_string do local char_code string.byte (long_string, i) encoded_string encoded_string .. char_code .. "," end encoded_…

[RCTF2015]EasySQL1 题目分析与详解

一、题目介绍: 1、题目来源: BUUCTF网址 2、题目介绍: 拿到flag。 二、解题思路: 我们发现题目首页有登录和注册账号两个选项,我们首先尝试注册账号,尝试注册username为admin的账号,输入密码…

RTSP协议

参考 本人也是初学,主要是为了初步了解该协议,便于后续开发中使用。RTSP RTSP服务端源码 B站新手向 函数 strdup() 概念 RTSP RTSP协议以客户服务器方式工作,,如:暂停/继续、后退、前进等。它是一个多媒体播放控制…

nginx.conf配置文件详解、案例,Nginx常用命令与模块

目录 一、Nginx常用命令 二、Nginx涉及的文件 2.1、Nginx 的默认文件夹 2.2、Nginx的主配置文件nginx.conf nginx.conf 配置的模块 2.2.1、全局块:全局配置,对全局生效 2.2.2、events块:配置影响 Nginx 服务器与用户的网络连接 2.2.3…

【计算机网络】1.4 接入网和物理媒体

1.4 接入网和物理媒体 问题:怎样将端系统和边缘路由器连接? 答:有线方式(住宅接入网络、单位接入网络等)或无线方式(无线接入网络)。 有线接入方式 光纤同轴混合网是基于已有的有线电视网开发的…

YOLOv9尝鲜测试五分钟极简配置

pip安装python包: pip install yolov9pip在https://github.com/WongKinYiu/yolov9/tree/main中下载好权重文件yolov9-c.pt。 运行下面代码: import yolov9model yolov9.load("yolov9-c.pt", device"cpu") # load pretrained or c…

【机器人学导论笔记】三、操作臂正运动学

3.1 概述 操作臂正运动学研究操作臂的运动特性,主要涉及与运动有关的几何参数和时间参数。本章中,只研究静止状态下操作臂连杆的位置和姿态。 处理这些复杂的几何参数需要一些步骤:首先需要在操作臂的每个连杆上分别固接一个连杆坐标系&…

linux---安使用nginx

目录 一、编译安装Nginx 1、关闭防火墙,将安装nginx所需要软件包传到/opt目录下 ​编辑2、安装依赖包 3、创建运行用户、组 4、编译安装nginx 5、创建软链接后直接nginx启动 ​编辑 6、创建nginx自启动文件 ​编辑6.1 重新加载配置、设置开机自启并开启服务…

LeetCode | 两数相加 C语言

Problem: 2. 两数相加 文章目录 思路解题方法Code一些感想 思路 主要是一一相加和逆序的方式存储 先说逆序储存,看下图 我们先声明出指针p和指针q,还有指针head(主要用于return上而已),然后进行一系列操作&#xff0c…

2 easy 27. 移除元素

双指针法 复杂度: //给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 // // 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 // // 元素的顺…