pytorch文本分类(二):引入pytorch处理文本数据

pytorch文本数据处理

目录

  • pytorch文本数据处理
    • 1. Pytorch背景
    • 2. 数据分割
    • 3. 数据加载
        • Dataset
          • 代码分析
          • 字典的用途
          • 代码修改的目的
        • Dataloader
    • 4. 练习

原学习任务链接

相关数据链接:https://pan.baidu.com/s/1iwE3LdRv3uAkGGI2fF9BjA?pwd=ro0v
提取码:ro0v
–来自百度网盘超级会员V4的分享

1. Pytorch背景

Pytorch介绍
PyTorch是一个开源的Python机器学习库,应用于人工智能领域,如自然语言处理。它主要由Facebook的人工智能研究团队开发。

Pytroch 数据处理流程
Pytorch的数据处理流程主要是数据分割和数据加载这两部分,其中数据分割包含创建Dataset和DataLoader,循环DataLoader,将text, label加载到模型中进行训练。

2. 数据分割

随机将一个数据集分割成给定长度的不重叠的新数据集。可选择固定生成器以获得可复现的结果(效果同设置随机种子)。

torch.utils.data.random_split(dataset, lengths, generator=<torch._C.Generator object>)  

参数介绍:

dataset (Dataset) :要分割的数据集。

lengths (Sequence) :要分割的长度。

generator (Generator) :用于随机排列的生成器。

import torch
from torch.utils.data import random_splitdataset = range(10)  # range类型,可以通过for循环或者直接转换为list后打印出来。
train_dataset, test_dataset = random_split(dataset=dataset,lengths=[7, 3],generator=torch.Generator().manual_seed(0)) #分割测试和训练集
print(list(train_dataset))
print(list(test_dataset))
[4, 1, 7, 5, 3, 9, 0]
[8, 6, 2]C:\Users\chengyuanting\.conda\envs\pytorch_cpu\lib\site-packages\tqdm\auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.htmlfrom .autonotebook import tqdm as notebook_tqdm

’ generator=torch.Generator().manual_seed(0) '解析:

  1. ’ torch.Generator() ’ :这是一个PyTorch对象,提供了生成随机数的机制。PyTorch中使用生成器来管理各种随机数生成函数和操作的随机数生成状态,特别是那些涉及随机过程的随机数生成,如洗牌数据或初始化权重。使用生成器确保随机数的生成更容易控制和再现。

  2. ’ .manual_seed(0) ’ :在生成器对象上调用此方法以设置其种子。设置种子是编程中的一种常见做法,特别是在机器学习和数据科学中,以确保结果的可重复性。当您设置种子时,它将随机数生成器初始化为已知状态。在本例中,种子被设置为’ 0 '。因此,每次运行此代码时,生成器都会生成相同的随机数序列,这反过来意味着每次执行代码时,诸如变换或分割数据集之类的操作都会产生相同的结果。

在代码片段的上下文中,您将数据集拆分为训练集和测试集,“generator=torch.Generator().manual_seed(0)”用于确保拆分是可重复的。这意味着每次运行代码时,您都会得到相同的训练和测试子集,这在实验设置中通常是理想的,因为您希望在不同的运行中得到一致的结果。

3. 数据加载

Pytorch的数据加载主要依赖torch.utils.data.Dataset和torch.utils.data.DataLoader两个模块,可以完成傻瓜式加载。

Dataset

Pytorch中,任何基于索引读取数据(map-style: from keys to data samples)的类均需继承torch.utils.data.Dataset,该类为数据的读取定义了格式。我们可以通过torch.utils.data.Dataset源码得到该类的具体结构:

class Dataset(object):  def __getitem__(self, index):  raise NotImplementedError  def __add__(self, other):  return ConcatDataset([self, other])  

数据示例:

请添加图片描述

# 创建自定义的Dataset 
import pandas as pd
import torch
from torch.utils.data import Dataset
class textDataset(Dataset):def __init__(self,csv_path): # Initialize file path or list of file names.super().__init__()self.install_data = pd.read_csv(csv_path, encoding='utf8', sep=',')def __len__(self):# You should change 0 to the total size of your dataset.return len(self.install_data)def __getitem__(self, idx):# 1. Read one data from file (e.g. using numpy.fromfile, PIL.Image.open).# 2. Preprocess the data (e.g. torchvision.Transform).# 3. Return a data pair (e.g. image and label).#这里需要注意的是,第一步:read one data,是一个datainput_data = pd.DataFrame([])label = pd.DataFrame([])input_data = self.install_data.iloc[idx, 3]label = self.install_data.iloc[idx, 0]return label, input_data
#实例化
lyrics = textDataset('./data/songdata.csv')
label = []
label,text = lyrics[20:50]
print('label:',label[20],'\nlyrics: ',text[20])   #读取第20行的歌手label和歌词text
label: ABBA 
lyrics:  I'm down and I feel depressed  
Sitting here just waiting  
For next bus travelling  
Downtown  
It's a crying shame  
Isn't it  
The beautiful weather  
If I could have my way  
Well, I would not be working  
On a day like this I know what I'd like to be  
As free as a bumble bee  
Take a sip from  
Every flower  
Free as a bumble bee  
While away each lazy hour  
What a good life  
Lying laid back  
Like an old railroad bum by the track  
What a good life  
Living outdoors  
Lie in the grass and chew on a straw

针对以上通用代码,GPT提出的定制化建议:
您的代码通常结构良好,可以在PyTorch中定义自定义’ Dataset '类来处理CSV文件中的数据。但是,要使其正常工作,需要解决一些问题:

  1. 在’ getitem '中切片:PyTorch ’ Dataset ‘中的’ getitem ‘方法被设计用于处理单个项目访问,而不是切片(如’ lyrics[20:50] ‘)。如果你想访问一个范围的项,你应该遍历索引或修改’ getitem '方法来处理切片。

  2. DataFrame初始化:在’ getitem ‘方法中,您将’ input_data ‘和’ label '初始化为空DataFrame,但随后您为它们分配一个来自Series的值。这是不必要的;您可以直接赋值。

  3. 返回张量:通常,PyTorch数据集以PyTorch张量的形式返回数据。如果你的’ input_data ‘和’ label '还不是张量,你可能需要在返回之前转换它们。

  4. 切片语法错误:在’ label, text = lyrics[20:50] ‘行中,您试图解压缩切片操作的结果,这将不会像当前’ getitem '定义所期望的那样工作。

这是你的代码调整后的版本(确实要比原版代码好哈哈哈):

class textDataset(Dataset):def __init__(self, csv_path): super().__init__()self.install_data = pd.read_csv(csv_path, encoding='utf8', sep=',')def __len__(self):return len(self.install_data)def __getitem__(self, idx):if torch.is_tensor(idx):idx = idx.tolist()input_data = self.install_data.iloc[idx, 3]label = self.install_data.iloc[idx, 0]# Convert to tensor if necessary, e.g.:# input_data = torch.tensor(input_data)# label = torch.tensor(label)return label, input_data# To access a range of items, you can do something like this:
lyrics = textDataset('./data/songdata.csv')
for i in range(20, 50):label, text = lyrics[i]print(f'label: {label}, lyrics: {text}')
label: ABBA, lyrics: I'm down and I feel depressed  
Sitting here just waiting  
For next bus travelling  
Downtown  
It's a crying shame  
Isn't it  
The beautiful weather  
If I could have my way  
Well, I would not be working  
On a day like this I know what I'd like to be  
As free as a bumble bee  
Take a sip from  
Every flower  
Free as a bumble bee  
While away each lazy hour  
What a good life  
Lying laid back  
Like an old railroad bum by the track  
What a good life  
Living outdoors  
Lie in the grass and chew on a strawlabel: ABBA, lyrics: Twinkle, Twinkle little star  
How I wonder what you are  
Like a diamond glitt'ring in the sky  
Seems to me you shine your light  
Down to me to say goodnight  
Twinkle, Twinkle my old friend  
Sleep is waiting round the bend  
While you travel through the milky way  
From afar  
Twinkle, Twinkle, Twinkle little star.  ...Knowing me, knowing you (ah-haa)  
There is nothing we can do  
Knowing me, knowing you (ah-haa)  
We just have to face it, this time we're through  
(This time we're through, this time we're through  
This time we're through, we're really through)  
Breaking up is never easy, i know but i have to go  
(I have to go this time  
I have to go, this time i know)  
Knowing me, knowing you  
It's the best i can do

import time
import torchtext
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iteratortokenizer = get_tokenizer('basic_english')
train_iter = lyricsdef yield_tokens(data_iter):# for _,text in data_iter:#	yield tokenizer(text)for i in range(len(data_iter)):  # 通过索引去遍历整个数据集_, text = data_iter[i]yield tokenizer(text)start = time.time()
vocab = build_vocab_from_iterator(yield_tokens(train_iter), specials=["<unk>"])
cost = time.time() - start
print(f"Build vocab cost: {cost:.4f}")vocab.set_default_index(vocab["<unk>"])
print('The vocabulary "wonderful" is ', vocab['wonderful'])
print('The vocabulary "beautiful" is ', vocab['beautiful'])
Build vocab cost: 9.8542
The vocabulary "wonderful" is  991
The vocabulary "beautiful" is  430

当然,我将逐句分析您的代码,并解释建立字典的用途,以及对代码的修改如何确保正确遍历数据集。

代码分析
  1. 导入模块和设置分词器:

    import time
    import torchtext
    from torchtext.data.utils import get_tokenizer
    from torchtext.vocab import build_vocab_from_iteratortokenizer = get_tokenizer('basic_english')
    

    这段代码导入了必要的模块,并创建了一个用于英语的基本分词器。分词器的作用是将文本分割成单词或词素。

  2. 定义数据迭代器:

    train_iter = lyrics
    

    这里将自定义的数据集 lyrics 赋值给 train_iter,意味着后续的操作将对这个数据集进行迭代。

  3. 定义生成单词的函数:

    def yield_tokens(data_iter):for i in range(len(data_iter)):  # Iterating through the dataset_, text = data_iter[i]yield tokenizer(text)
    

    这个函数遍历数据集 data_iter,对每个样本的文本部分应用分词器,并逐个产生单词。我在这里修改了遍历方式,使用索引来确保可以逐个访问数据集中的每个样本。

  4. 建立词汇表:

    start = time.time()
    vocab = build_vocab_from_iterator(yield_tokens(train_iter), specials=["<unk>"])
    cost = time.time() - start
    print(f"Build vocab cost: {cost:.4f}")
    

    这段代码使用从数据集中提取的单词建立词汇表,并记录所花费的时间。specials=["<unk>"] 表示在词汇表中添加一个特殊的未知单词标记 <unk>

  5. 设置未知单词的默认索引:

    vocab.set_default_index(vocab["<unk>"])
    

    这行代码设定了对于词汇表中不存在的单词,默认返回 <unk> 的索引。

  6. 获取特定单词的索引:

    print('The vocabulary "wonderful" is ', vocab['wonderful'])
    print('The vocabulary "beautiful" is ', vocab['beautiful'])
    

    这里打印了单词 “wonderful” 和 “beautiful” 在词汇表中的索引。

字典的用途

建立字典(词汇表)在自然语言处理(NLP)中非常重要,主要用途包括:

  1. 单词到索引的映射:字典提供了一种将单词转换为数字索引的方式,这对于计算机处理文本数据是必要的。

  2. 统计和限制词汇:通过字典,可以控制模型学习的词汇范围,并且可以统计和分析数据集中单词的出现频率。

  3. 数据预处理:在训练神经网络模型时,通常需要将文本转换为数值形式,字典是实现这一转换的关键组件。

代码修改的目的

原始代码中,yield_tokens 函数直接遍历 data_iter,这在某些情况下可能会导致问题,因为标准的 PyTorch Dataset 类不支持直接通过 for 循环进行遍历。通过使用索引访问每个元素,可以确保无论 Dataset 的具体实现如何,代码都能正确地访问每个数据点。这种方法更加通用,可以适用于更广泛的 Dataset 实现。

Dataloader

torch.utils.data.DataLoader是实际的数据采样器/迭代器,以单/多进程迭代的方式在封装的Dataset上获取数据。具体地,迭代器DataLoader使用next()方法以不断获得数据。❗️需注意,DataLoader只读取tensor,故常需在Dataset中将源数据转化为tensor。常用模块如transforms等。

由torch.utils.data.DataLoader源码可以得到该类的参数如下,接下来简单介绍一下主要参数的用法:

class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,  batch_sampler=None, num_workers=0, collate_fn=None,  pin_memory=False, drop_last=False, timeout=0,  worker_init_fn=None, multiprocessing_context=None)  

batch_size(Int):即一次训练所抓取的数据样本数量,它的大小影响训练速度和模型优化,也同样影响每一epoch训练模型次数。设置batch_size可以使得CPU或GPU不会内存爆炸,提高了训练的速度,其次是使得梯度下降的方向更加准确。

shuffle(Boolean):shuffle是深度学习中将训练模型的数据集进行打乱的操作。原始的数据,在样本均衡的情况下可能是按照某种顺序进行排列,如前半部分为a类数据,后半部分为b类数据。但经过打乱之后数据的排列就会拥有一定的随机性,在顺序读取的时候下一次得到的样本为任何一类型的数据的可能性相同。shuffle的好处是,在针对随机性敏感的数据集上,可以提升模型质量和提升预测表现。

num_workers(Int):用于数据加载的子进程数量。 0 表示数据将在主进程中加载。

# 使用Dataloader去加载数据集
from torch.utils.data import DataLoader
dataloader = DataLoader(train_iter, batch_size=8, shuffle=False)
print('The length of dataloader is ',len(dataloader))
The length of dataloader is  7207

4. 练习

  1. BATCH_SIZE = 64,而数据集的大小为120,问一个epoch要训练几个批次?
answer_1 = '2' #答案填在引号内
  1. 使用数据分割样例代码,按照80%的训练集和20%的测试集的比例来切割’/home/mw/input/geci_82079530/songdata.csv’中的英文语料后,问训练集和测试集的数量分别是多少?
length = len(lyrics)
len_train = int(0.8*length)
len_test = int(0.2*length)
answer_2 = f'{len_train}' #训练集的样本数量,答案填在引号内
answer_3 = f'{len_test}' #测试集的样本数量,答案填在引号内

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

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

相关文章

Django和ECharts异步请求示例

前提条件 创建django项目&#xff0c;安装配置过程这里就不讲述了。 后端url http://127.0.0.1:8000/echarts/demo/ view视图函数 from django.http import HttpResponse import jsondef EchartsDemo(request):data {}categories ["衬衫","羊毛衫",&…

Java架构师系统架构高性能维度分析

目录 1 导语2 性能维度概述和定义3 高性能流程4 高性能实现方案-缓存为王5 高性能实现方案-异步为帅、分布式为将6 高性能高并发架构案例分析7 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 Java架构师在构建高性能系统架构时,需要关注以下几个关键维度:…

Monkey工具之fastbot-iOS实践

背景 目前移动端App上线后 crash 率比较高&#xff0c; 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性&#xff0c;更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享&#xff0c;所以很自然的就想到Fastbot工具。 Fastbot-iOS安装配置 准备工…

低代码与自动化:加速软件开发的新趋势

低代码与自动化技术正在逐渐改变软件开发的面貌。随着科技的不断发展&#xff0c;传统的编程方式已经不再是唯一的选择。低代码和自动化技术正在为开发者提供更高效、更灵活的开发环境&#xff0c;使得软件开发变得更加简单、快速和高效。 低代码和自动化技术正在逐渐改变软件开…

杨辉三角形-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第17讲。 杨辉三角形&#…

模型放置到3D场景中后模型位置与鼠标选中的位置不一致怎么办?

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、问题 从事3D建模相关工作的朋友们在工作中经常会遇到以下几种问题&#…

RS485转WiFi工业路由器在冷链物流温度监控中的应用

随着物联网技术的不断发展和应用&#xff0c;冷链物流行业也迎来了新的机遇和挑战。在冷链物流中&#xff0c;对温度监控的要求尤为重要&#xff0c;因为温度是保证货物质量和安全的关键因素之一。而RS485转WiFi工业路由器则成为了实现高效、可靠的温度监控系统的重要组成部分。…

做博客网站需要什么配置的服务器?

​  利用搭建博客网站&#xff0c;来分享生活、知识和经验&#xff0c;是很多个人站长乐意做的事情。但&#xff0c;对于互联网行业的新人来说&#xff0c;或许不知道搭建个人博客网站的配置如何选择&#xff0c;本文针对这一点&#xff0c;从地域、服务器类型、配置参数等方…

SpringBoot整合Lucene实现全文检索【详细步骤】【附源码】

笑小枫的专属目录 1. 项目背景2. 什么是Lucene3. 引入依赖&#xff0c;配置索引3.1 引入Lucene依赖和分词器依赖3.2 表结构和数据准备3.3 创建索引3.4 修改索引3.5删除索引 4. 数据检索4.1 基础搜索4.2 一个关键词&#xff0c;在多个字段里面搜索4.3 搜索结果高亮显示4.4 分页检…

【开源Mongdb驱动】SpringBoot+Mybatis+Mongdb融合使用教程

#【开源Mongdb驱动】SpringBootMybatisMongdb无缝融合使用教程 介绍 本文介绍一款基于JAVA开源的mongodb jdbc驱动为基础的无缝与springbootmybatis融合使用案例 mongodb JDBC 使用案例 https://blog.csdn.net/gongbing798930123/article/details/135002530 《基于开源的JA…

流程图、泳道图的介绍和示例分享,以及自定义元件库的介绍

目录 一. 流程图介绍 二. Processon使用 新建一个流程图 图形的使用 三. 流程图示例 登录界面 门诊业务流程图 住院业务流程图 药房业务流程图 会议OA流程图 四. 泳道图介绍 五. 自定义元件库 5.1 新建一个元件库 5.2 创建元件 5.3 使用自定义元件库 一. 流程图介…

三星挑战台积电霸主地位,2nm订单争夺战硝烟四起

根据Trendforce报道&#xff0c;台积电依然在代工行业拥有绝对的领导地位。台积电和三星都计划在2025年开始生产2nm工艺&#xff0c;引发了相关订单的早期争夺战。 扩展阅读&#xff1a;华山论剑&#xff1a;2nm芯片工艺谁更强&#xff1f; 据英国《金融时报》报道&#xff0c…

【Eureka】自定义元数据消失原因?

【Eureka】自定义元数据运行很长一段时间后&#xff0c;自定义元数据&#xff08;scheduler.server.enabled&#xff09;偶尔会消失&#xff0c;但服务元数据信息还在 eureka是单节点的&#xff0c;这个应用服务也是单节点的 代码实现方式如下 我看过eureka服务的日志信息&…

GoWin FPGA, GPIO--- startup2

一个Bank只能用一个电压&#xff0c;假如同一个Bank&#xff0c;在引脚里设置不同的电压&#xff0c;编译不过。 解释说明 2. 错误引脚限制 以上编译设置会导致编译错误。

访问修饰符

1.java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)。 1.公开级别:用public修饰,对外公开 2.受保护级别:用protected修饰,对子类和同一个包中的类公开 3.默认级别:没用修饰符,向同一个包的类公开 4.私有级别:用private修饰,只有本类可以访问,不…

vscode 环境配置

必备插件 配置调试 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","confi…

如何优雅地观察 Vue.js 3 中 localStorage 的变化?

为什么要这样做&#xff1f; 原生 localStorage 只能监听同源跨不同页面的变化。然而&#xff0c;对于单页面应用程序来说&#xff0c;这种方式并不实用。因此&#xff0c;我打算创建一个自定义钩子来监视 localStorage 中的变化。 方法 我们需要重写 localStorage 下的所有…

开源IPad Pro应用IDE:使用SSH远程连接服务器进行云端编程开发

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

Linux——MySQL备份与恢复

一、数据库备份概述 1、数据备份的重要性 在企业中数据的价值至关重要&#xff0c;数据保障了企业业务的正常运行。因此&#xff0e;数据的安全性及数据的可靠性是运维的重中之重&#xff0c;任何数据的丢失都可能对企业产生严重的后果。通常情况下造成数据丢失的原因有如下几种…

10.CSS浮动

CSS浮动 1.介绍 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一 2.作用 让元素脱离标准流&#xff0c;同一级的浮动的元素可以并排在一排显示 3.元素浮动后的特点 脱离文档流不管浮动前是什么元素&#xff0c;浮动后&…