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_split

dataset = 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.html
  from .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,是一个data
        input_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 straw


label: 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_iterator

tokenizer = get_tokenizer('basic_english')
train_iter = lyrics

def 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_iterator
    
    tokenizer = 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}' #测试集的样本数量,答案填在引号内

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日志框架Log4j、JUL、JCL、Slf4j、Logback、Log4j2

为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控&#xff0c;那么如果程序出现异常错误时要如何排查呢&#xff1f;并且系统在运行时做了哪些事情我们又从何得知呢&#xff1f;这个时候日志这个概念就出现了&#xff0c;日志的出现对系统监控和异常分析起着…

wordpress 修改社交图标

要去掉标记的图标&#xff0c;死活找不到在那里配置。后来找到了&#xff0c;下图&#xff08;wordpress 小白&#xff0c;特此记录&#xff09;

java --- lambda表达式

1、先爽用一下lambda lambda表达式很大一个作业就是简化匿名内部类 public class case1 {public static void main(String[] args) {Integer[] arr {2,5,1,0,9,7,4};Integer[] arr2 {2,5,1,0,9,7,4};//使用匿名内部类作为比较器Arrays.sort(arr, new Comparator<Integer…

Java 实现汉字转拼音带单调

代码 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; import net.sourcefo…

【VRTK】【VR开发】【Unity】15-远程抓取

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【背景】 之前的篇章介绍了如何实现直接抓取,本篇介绍另一种抓取方式-远程抓取。 【远程抓取的先决条件】 要让远程抓取起作用,需要先设置oculus提供的手部…

定时限电流继电器 JL-8D/2X112A5 AC220V 0.1~9.9S 0.1~9.9A 导轨

系列型号 JL-8D/3X1定时限电流继电器&#xff1b;JL-8D/3X111A2定时限电流继电器&#xff1b; JL-8D/3X121A2定时限电流继电器&#xff1b;JL-8D/3X211A2定时限电流继电器&#xff1b; JL-8D/3X221A2定时限电流继电器&#xff1b;JL-8D/3X2定时限电流继电器&#xff1b; JL…

天翼云盘秒变硬盘分享

https://cloud.189.cn/web/share?codeAvUnqaj6NNza&#xff08;访问码&#xff1a;wf4r&#xff09;y 以下介绍为作者开发的单机版软件&#xff0c;可用于Windows环境中将天翼云盘挂载为本地硬盘&#xff0c;确实可以达到本地硬盘的使用感知&#xff0c;对于多终端数据副本一…

Tomcat的结构和部署

目录 什么是tomcat&#xff1f; Tomcat 核心的组件三个 什么是 servlet&#xff1f; 什么是 JSP? Tomcat 功能组件结构&#xff1a; Container 结构分析&#xff1a; Tomcat 请求过程&#xff1a; 具体部署Tomcat 将安装包移动到opt目录下 配置systemd控制 验证访…

2 - Electron 核心概念

Electron 核心概念 主进程 通过Node.js、Electron提供的API与系统底层打交道启动项目时运行的 main.js 脚本就是我们说的主进程。在主进程运行的脚本可以以创建 Web 页面的形式展示 GUI。主进程只有一个 渲染进程 每个 Electron 的页面都在运行着自己的进程&#xff0c;这样…

每天五分钟计算机视觉:GoogLeNet的核心模型结构——Inception

本文重点 当构建卷积神经网络的时候,我们需要判断我们的过滤器的大小,这往往也作为一个超参数需要我们进行选择。过滤器的大小究竟是 11,33 还是 55,或者要不要添加池化层,这些都需要我们进行选择。而本文介绍的Inception网络的作用就是代替你来决定,把它变成参数的一部…

软件设计师——软件工程(二)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

ZLMediaKit 编译以及测试(Centos 7.9 环境)

文章目录 一、前言二、编译器1、获取代码2、编译器2.1 编译器版本要求2.2 安装编译器 3、安装cmake4、依赖库4.1 依赖库列表4.2 安装依赖库4.2.1 安装libssl-dev和libsdl-dev4.2.2 安装 ffmpeg-devel依赖和ffmpeg依赖 三、构建和编译项目&#xff08;启用WebRTC功能&#xff09…

pytorch:to()、device()、cuda()将Tensor或模型移动到指定的设备上

将Tensor或模型移动到指定的设备上&#xff1a;tensor.to(‘cuda:0’) 最开始读取数据时的tensor变量copy一份到device所指定的GPU上去&#xff0c;之后的运算都在GPU上进行在做高维特征运算的时候&#xff0c;采用GPU无疑是比用CPU效率更高&#xff0c;如果两个数据中一个加了…

智慧城市/一网统管建设:人员危险行为检测算法,为城市安全保驾护航

随着人们压力的不断增加&#xff0c;经常会看见在日常生活中由于小摩擦造成的大事故。如何在事故发生时进行及时告警&#xff0c;又如何在事故发生后进行证据搜索与事件溯源&#xff1f;旭帆科技智能视频监控人员危险行为/事件检测算法可以给出答案。 全程监控&#xff0c;有源…

智能优化算法应用:基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于探路者算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.探路者算法4.实验参数设定5.算法结果6.参考文…

人工智能导论习题集(5)

第四章&#xff1a;搜索策略 题1题2 题1 题2 参考文献&#xff1a;https://blog.csdn.net/m0_64372178/article/details/134890561

平头哥玄铁 E906 编译与使用

1、E906 概述 与玄铁 E902 一样&#xff0c; E906 核的 RTL 代码也是开源的&#xff0c;开源仓库地址&#xff1a;https://github.com/T-head-Semi/opene906 玄铁 E906 是一款完全可综合的中端 MCU 级处理器&#xff0c;兼容 RV32IMA[F][D]C[P] 指令集&#xff0c;提供可观的…

C# WPF上位机开发(动态添加控件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 写图形界面软件的时候&#xff0c;我们经常会遇到一种情况。那就是图形界面上面&#xff0c;显示的控件可能是不定的。有可能多&#xff0c;也有可…

JupyterNotebook VS JupyterLab 如果jupyter安装成功,点击jupyterlab即可进入lab环境

简介 JupyterNotebook 是一个款以网页为基础的交互计算环境&#xff0c;可以创建Jupyter的文档&#xff0c;支持多种语言&#xff0c;包括Python, Julia, R等等。一般来说&#xff0c;如果是使用R语言的话&#xff0c;使用Rstudio居多&#xff0c;使用Python的话&#xff0c;使…

消息队列 - RabbitMQ

消息队列 - RabbitMQ 1. 初识 MQ1.1 同步调用1.2 异步调用1.3.技术选型 2. RabbitMQ2.1 安装2.2 收发信息2.2.1 交换机(Exchange)2.2.2 队列2.2.3 绑定关系2.2.4 发送消息 2.3 数据隔离 相关文章: SpringAMQP 快速入门 RabbitMQ 如何保证消息可靠性 1. 初识 MQ 微服务一旦拆分…