d2l语言模型--生成小批量序列

语言模型-pytorch #语言模型和数据集 import matplotlib.pyplot as plt import random import torch from d2l import torch as d2l tokens = d2l.tokenize(d2l.read_time_machine()) corpus = [token for line in tokens for token in line] vocab = d2l.Vocab(corpus) # print(vocab.token_freqs[:.. 阅读详情

对语言模型的数据集处理做以下汇总与总结

目录

1.k元语法

1.1一元

1.2 二元

1.3 三元

2.随机抽样

 2.1各bs之间随机

2.2各bs之间连续

3.封装


1.k元语法

1.1一元

tokens = d2l.tokenize(d2l.read_time_machine())
# 因为每个⽂本⾏不⼀定是⼀个句⼦或⼀个段落,因此我们把所有⽂本⾏拼接到⼀起
corpus = [token for line in tokens for token in line]
vocab = d2l.Vocab(corpus)

  看看得到了什么:corpus为原txt所有词汇拉成一维list;token_freqs为按1元语法统计的token-freqs列表。

vocab.token_freqs[:10], corpus[:20]

'''
([('the', 2261),
  ('i', 1267),
  ('and', 1245),
  ('of', 1155),
  ('a', 816),
  ('to', 695),
  ('was', 552),
  ('in', 541),
  ('that', 443),
  ('my', 440)],
 ['the',
  'time',
  'machine',
  'by',
  'h',
  'g',
  'wells',
  'i',
  'the',
  'time',
  'traveller',
  'for',
  'so',
  'it',
  'will',
  'be',
  'convenient',
  'to',
  'speak',
  'of'])
'''

1.2 二元

  二元即为将前后两词连在一起当作一个词元,其token为一个包含tuple的list,其中每个tuple为元txt各2个相邻词组成。

bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab = d2l.Vocab(bigram_tokens)
# 返回
bigram_vocab.token_freqs[:10],bigram_tokens[:5]

'''
([(('of', 'the'), 309),
  (('in', 'the'), 169),
  (('i', 'had'), 130),
  (('i', 'was'), 112),
  (('and', 'the'), 109),
  (('the', 'time'), 102),
  (('it', 'was'), 99),
  (('to', 'the'), 85),
  (('as', 'i'), 78),
  (('of', 'a'), 73)],
 [('the', 'time'),
  ('time', 'machine'),
  ('machine', 'by'),
  ('by', 'h'),
  ('h', 'g')])
'''

  其中,讲一下相邻2词的实现:

bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_tokens[:5]

'''
[('the', 'time'),
 ('time', 'machine'),
 ('machine', 'by'),
 ('by', 'h'),
 ('h', 'g')]
'''

  传入Vocab的tokens为一个list,如果是2维list则会展平成1维;如果本身就为1维则直接对里面的每个元素进行操作

 注意,二元语法中传入Vocab的bigram_tokens是如图组成的二元语法,里面每个元素为前后相邻两个字符串为元组的list,在计数的时候不会被拉成1维的list,因为其本身每个需要计数的元素就是bigram_tokens里面的每个元素(二元元组)

1.3 三元

类似的操作:

trigram_tokens = [triple for triple in zip(
    corpus[:-2], corpus[1:-1], corpus[2:])]
trigram_vocab = d2l.Vocab(trigram_tokens)
trigram_vocab.token_freqs[:10]

'''
[(('the', 'time', 'traveller'), 59),
 (('the', 'time', 'machine'), 30),
 (('the', 'medical', 'man'), 24),
 (('it', 'seemed', 'to'), 16),
 (('it', 'was', 'a'), 15),
...]
'''

实现细节:

corpus[-7:], corpus[:-2][-5:], corpus[1:-1][-5:], corpus[2:][-5:]

'''
(['lived', 'on', 'in', 'the', 'heart', 'of', 'man'],
 ['lived', 'on', 'in', 'the', 'heart'],
 ['on', 'in', 'the', 'heart', 'of'],
 ['in', 'the', 'heart', 'of', 'man'])
'''

2.随机抽样

  任务,给定一个corpus为所有单词拼起来的一维list,输出X,Y,尺寸为(bs,T),实现如下的分割,注意前k个和最后若不足以配T个的就都扔了。

 2.1各bs之间随机

def seq_data_iter_random(corpus, batch_size, num_steps): #@save
    """使⽤随机抽样⽣成⼀个⼩批量⼦序列"""
    # 从随机偏移量开始对序列进⾏分区,随机范围包括num_steps-1
    corpus = corpus[random.randint(0, num_steps - 1):]
    # 减去1,是因为我们需要考虑标签
    num_subseqs = (len(corpus) - 1) // num_steps
    # ⻓度为num_steps的⼦序列的起始索引
    initial_indices = list(range(0, num_subseqs * num_steps, num_steps))
    # 在随机抽样的迭代过程中,
    # 来⾃两个相邻的、随机的、⼩批量中的⼦序列不⼀定在原始序列上相邻
    random.shuffle(initial_indices)
    
    def data(pos):
        # 返回从pos位置开始的⻓度为num_steps的序列
        return corpus[pos: pos + num_steps]

    num_batches = num_subseqs // batch_size
    for i in range(0, batch_size * num_batches, batch_size):
        # 在这⾥,initial_indices包含⼦序列的随机起始索引
        initial_indices_per_batch = initial_indices[i: i + batch_size]
        X = [data(j) for j in initial_indices_per_batch]
        Y = [data(j + 1) for j in initial_indices_per_batch]
        yield torch.tensor(X), torch.tensor(Y)

  num_steps相当于T,表示切分的每个子块中含有多少个词
  corpus考虑对前K个,随机切除,前K个就不要了
  num_subseqs是看切后的corpus能组成多少个T的块,采用向下取整。在这里为31//5=6
  initial_indices计算每个子序列块起始位置的索引
  num_batches表示用块的个数除bs,向下取整
  for loop 里面i的分割是bs,保证后面取bs个起始位置时不会取重:(见下图例子)

 initial_indices_per_batch表示从块起始索引位置list中,抽取bs个起始位置。

my_seq = list(range(35))
for X, Y in seq_data_iter_random(my_seq, batch_size=2, num_steps=5):
    print('X: ', X, '\nY:', Y)

'''
X:  tensor([[22, 23, 24, 25, 26],
        [ 2,  3,  4,  5,  6]]) 
Y: tensor([[23, 24, 25, 26, 27],
        [ 3,  4,  5,  6,  7]])
X:  tensor([[17, 18, 19, 20, 21],
        [ 7,  8,  9, 10, 11]]) 
Y: tensor([[18, 19, 20, 21, 22],
        [ 8,  9, 10, 11, 12]])
X:  tensor([[12, 13, 14, 15, 16],
        [27, 28, 29, 30, 31]]) 
Y: tensor([[13, 14, 15, 16, 17],
        [28, 29, 30, 31, 32]])
'''

  X,Y均为(bs,T).

  22预测23;22,23预测24;22,23,24预测25...

2.2各bs之间连续

def seq_data_iter_sequential(corpus, batch_size, num_steps): #@save
    """使⽤顺序分区⽣成⼀个⼩批量⼦序列"""
    # 从随机偏移量开始划分序列
    offset = random.randint(0, num_steps)
    num_tokens = ((len(corpus) - offset - 1) // batch_size) * batch_size
    Xs = torch.tensor(corpus[offset: offset + num_tokens])
    Ys = torch.tensor(corpus[offset + 1: offset + 1 + num_tokens])
    Xs, Ys = Xs.reshape(batch_size, -1), Ys.reshape(batch_size, -1)
    num_batches = Xs.shape[1] // num_steps
    for i in range(0, num_steps * num_batches, num_steps):
        X = Xs[:, i: i + num_steps]
        Y = Ys[:, i: i + num_steps]
        yield X, Y

  num_batches表示能输出几个bs,后面不够bs的都扔掉:

  对应这3个:

 与random一样,核心都是块数//bs,其中块数=cor//num_step(T)

3.封装

class SeqDataLoader: #@save
    """加载序列数据的迭代器"""
    def __init__(self, batch_size, num_steps, use_random_iter, max_tokens):
        if use_random_iter:
            self.data_iter_fn = d2l.seq_data_iter_random
        else:
            self.data_iter_fn = d2l.seq_data_iter_sequential
        self.corpus, self.vocab = d2l.load_corpus_time_machine(max_tokens)
        self.batch_size, self.num_steps = batch_size, num_steps
    def __iter__(self):
        return self.data_iter_fn(self.corpus, self.batch_size, self.num_steps)

对于其中的iter:

 

def load_data_time_machine(batch_size, num_steps, #@save
    use_random_iter=False, max_tokens=10000):
    """返回时光机器数据集的迭代器和词表"""
    data_iter = SeqDataLoader(
        batch_size, num_steps, use_random_iter, max_tokens)
    return data_iter, data_iter.vocab

李沐60_机器翻译数据集——自学笔记 假设同一个小批量中的每个序列都应该具有相同的长度num_steps, 那么如果文本序列的词元数目少于num_steps时, 我们将继续在其末尾添加特定的“”词元, 直到其长度达到num_steps;此外,我们还记录了每个文本序列的长度, 统计长度时排除了填充词元, 在稍后将要介绍的一些模型会需要这个长度信息。除此之外,我们还指定了额外的特定词元, 例如在小批量时用于将序列填充到相同长度的填充词元(“”), 以及序列的开始词元(“”)和结束词元(“”)。让我们绘制每个文本序列所包含的词元数量的直方图。 阅读详情

相关推荐

情感分析及数据集代码解析

11. 最后定义了一个函数`load_data_imdb`,它下载数据集、读取数据、分词、建立词汇表、处理文本为固定长度的序列,并返回训练和测试的数据迭代器以及词汇表供后续的神经网络模型使用。标签为'neg'表示消极的评论,使用0表示。7. 准备数据迭代器:数据被截断或填充至指定的序列长度(这里是500个单词),然后使用`d2l.load_array`函数将处理后的数据和标签封装成小批量的数据迭代器。1. 导入所需的包和模块,如`os`、`torch`、`nn`以及一个定制的深度学习库`d2l`。

数字人生 974

d2l.Vocab(sentences, min_freq=5, reserved_tokens=[‘<pad>‘, ‘<mask>‘, ‘<cls>‘, ‘<sep>‘]) 参数讲解

d2l.Vocab(sentences, min_freq=2, reserved_tokens=['<pad>', '<mask>', '<cls>', '<sep>']) sentences:源句子,比如说 sentences赋值为下边的五个句子 注意第一句我手动添加了两个'<unk>',第二句添加了'<pad>', '<mask>', '<cls>', '<sep>',作为第三个参数的测试 [

jjw_zyfx的博客 1463

大语言模型原理基础与前沿 扩大尺度法则

大语言模型原理基础与前沿 扩大尺度法则 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来 随着人工智能领域的飞速发展,大语言

AI架构师小马 1253

CNN语法【2】

用于设置随机数生成器的种子,以确保生成的随机数是可重现的。种子值可以是任意整数。用于生成指定范围内的整数随机样本,可以指定最小值(包括)和最大值(不包括)。用于生成指定形状的标准正态分布(均值为0,标准差为1)的随机样本。str.strip() : 去除字符串两边的空格。str.lstrip() : 去除字符串左边的空格。str.rstrip() : 去除字符串右边的空格。用于生成指定均值和标准差的正态分布的随机样本。参数含义:(均值,标准差,随机数个数)用于生成指定范围内的均匀分布的随机样本。

m0_68339197的博客 507

【计算机视觉40例】案例08:石头剪刀布手势识别

计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。......

计算机视觉之光 2155

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3605

《动手学深度学习》--- 文本预处理

做了什么事? 读取《时光机器》这本书 建立词表 通过词表将这本书转化为向量表示 Code #!/usr/bin/env python # -*- coding: UTF-8 -*- """ @Project :深度学习入门 @File :文本预处理.py @Author :little_spice @Date :2022/5/11 18:13 """ import collections import re from d2l import torch as d2l # 读取数据集:从H.G...

little_spice的博客 1725

2023华为od机试C卷【宽度最小的子矩阵】Python 实现

给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数。

MISAYAONE的博客 2185

语言模型和数据集

1.自然语言统计 import random import torch from d2l import torch as d2l tokens = d2l.tokenize(d2l.read_time_machine()) # 因为每个文本行不一定是一个句子或一个段落,因此我们把所有文本行拼接到一起 corpus = [token for line in tokens for token in line] corpus ['the', 'time', 'machine', 'by', 'h',

爱飞的企鹅 591

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1726

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 2792

终极指南:如何利用D2L.ai语言模型实现智能拼写检查与语法错误纠正

D2L.ai(交互式深度学习书籍)提供了强大的语言模型工具,可以帮助开发者构建智能拼写检查与语法错误纠正系统。本文将详细介绍如何利用D2L.ai中的语言模型技术,实现高效准确的文本纠错功能,适合新手和普通用户快速上手。 ## 为什么选择D2L.ai进行文本纠错? D2L.ai作为一个集多框架代码、数学和讨论于一体的交互式深度学习书籍,已被斯坦福、麻省理工、哈佛和剑桥等70个国家的500所大学采

gitblog_00688的博客 371

Vue3 - [最强] 超详细 Element Plus 组件库主题颜色进行 “统一全局“ 替换,将默认的蓝色主题色更换为其他自定义颜色,覆盖原来的主题色改为自己的颜色(完美解决主题色不生效、没反应)

elementplus修改主题色,vue3+element-plus主题色更换,vue3vite如何修改扩展elementplus主题色样式,全局设置elementplus主题色,有什么办法可以直接全局修改主题色,对elementplus默认蓝色不满意怎么替换更改其他颜色,elementplus覆盖默认主题色,elementplus主题色官方文档,vue3中修改elementplus主题色,elementplus修改主题色不生效怎么办,elementplus如何修改主题颜色,eleme

🏆 前端领域优质创作者 1万+

深入理解d2l-zh项目中的语言模型与数据集处理

深入理解d2l-zh项目中的语言模型与数据集处理 【免费下载链接】d2l-zh 《动手学深度学习》:面向中文读者、能运行、可讨论。中英文版被70多个国家的500多所大学用于教学。 项目地址: https://gitcode.com...

gitblog_01000的博客 295

PyTorch生成式人工智能(3)——使用PyTorch构建神经网络

在本节中,我们使用 PyTorch 在简单数据集上构建了一个神经网络,训练神经网络来映射输入和输出,并通过执行反向传播来更新权重值以最小化损失值,并利用 Sequential 类简化网络构建过程;介绍了获取网络中间值的常用方法,以及如何使用 save、load 方法保存和加载模型,以避免再次训练模型。

盼小辉丶的博客 1万+

FPGA上的时间数字转换器(TDC):详细概述及FPGA开发

本文对基于FPGA的时间数字转换器(TDC)进行了详细的概述,并提供了一个简单的示例代码,展示了如何在FPGA上实现TDC功能。在本文中,我们将详细概述基于FPGA的TDC,并提供相应的源代码示例,以帮助读者理解和实现这一功能。需要注意的是,这只是一个简单的示例,实际的TDC设计可能需要更多的功能和优化,以满足特定的需求。读取和重置:最后,测量结果可以通过读取计数器的值来获取,并且在每次读取后需要将计数器重置为零,以便进行下一次测量。TDC的基本原理是测量信号的到达时间与参考时钟之间的时间差。

EsqpWeller的博客 6861

PyTorch实战:BatchNorm1d在时间序列预测中的5个关键调参技巧

本文深入探讨了PyTorch中nn.BatchNorm1d在时间序列预测任务中的关键调参技巧。针对时间序列数据的特点,文章详细解析了momentum参数调节、小batch场景下的替代方案(如GroupNorm)、与Dropout的协同优化以及affine等高级参数设置,旨在帮助开发者优化Conv1d/LSTM等混合架构,提升模型训练稳定性和预测性能。

n2o3p4的博客 517

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

线性神经网路——线性回归随笔【深度学习】【PyTorch】【d2l】

这样得到的是一个NumPy数组,代表散点图中的x轴数据。优化函数没有直接使用损失值,但通过使用损失函数和反向传播计算参数的梯度,并将这些梯度应用于参数更新,间接地优化了模型的损失。来清零参数的梯度,那么参数将会保留上一次迭代计算得到的梯度值,继续沿用该梯度值来求解梯度。labels.detach().numpy() 是一个二维张量labels的分离和转换操作,得到一个NumPy数组,代表散点图中的y轴数据。简单说,就是计算损失值的张量运算不会记录到计算图中,因为没必要,而且不建立计算图,求损失值更快了。

cold的博客 3902

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

d2l从零与简洁实现RNN

一层循环神经网络的输出被用作下一层循环神经网络的输入''''''这里的X经过rnn得到的Y,输出的是(T,bs,hiddens),不涉及层的运算,指每个时间步的隐状态state尺寸为(隐藏层数,bs,hidden)''''''torch里面的rnnlayer只包括隐藏层,不包括输出层。

python_innocent的博客 2615

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Torch】nn.BatchNorm1d算法详解

是 PyTorch 中用于一维特征的批归一化层(Batch Normalization),常用于对全连接层或一维卷积(Conv1d)输出进行归一化。它通过对每个特征通道的输出在批次维度(及可选的时间/序列维度)上做归一化,使网络训练更稳定、收敛更快,并具有一定的正则化效果。

zkw54334的博客 2001

机器学习算法之Linear Regression线性回归的实现与理解(D2L)

D2L深度学习:Linear Regression线性回归的实现与理解 本篇是在学习了李沐大神的《dive into deeplearning》中的线性回归部分之后,动手实践做的一些笔记和注释

m0_64533860的博客 707

循环神经网络基础(d2l学习笔记)

循环神经网络 本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量HHH,用HtH_{t}Ht​表示HHH在时间步ttt的值。HtH_{t}Ht​的计算基于XtX_{t}Xt​和Ht−1H_{t-1}Ht−1​,可以认为HtH_{t}Ht​记录了到当前字符为止的序列信息,利用HtH_{t}H...

ly451x的博客 521

[动手学深度学习PyTorch笔记2]文本预处理、语言模型、循环神经网络

一、文本预处理 文本可以看作是字符或单词的一种序列数据。对文本的预处理包括: 1.读入文本 2.分词:对每个句子进行分词,将句子划分成若干个词(token),转换为一个词的序列。现有的分词工具有:spaCy和NLTK。 3.建立字典:每个词映射到一个唯一的索引(index),从而将字符串转换为数字。 4.将文本从词的序列转换为索引(数字)的序列,方便输入模型 二、语言模型 一段自然语言文本可以看作...

weixin_43246989的博客 344

学习语言模型

unigram-bigram-trigram 因为人只能根据已发生的事去推测未来,用频率去代替概率一元语法即朴素贝叶斯假设,这里马尔科夫假设(参考前面文章)就是假设现在x受到前面几个影响,三元语法就是受到前面两个一元就是只依赖自己,二元语法就是依赖前面一个词,三元语法就是依赖前面两个词实现就是可以存下所有比如二元语法的两个词在一起的频率,但空间复杂度太高了很多类方法都是上一节内容# 因为每个文本行不一定是一个句子或一个段落,因此我们把所有文本行拼接到一起。

qq_52122048的博客 319

pytorch笔记:BatchNorm1d

用于 running_mean 和 running_var 计算的值。可设置为 None,表示累积移动平均(即简单平均)。对2D或3D输入应用批量归一化。

qq_40206371的博客 475

EvoDiff核心模型解析:OADM与D3PM两大扩散方案如何实现高保真蛋白质设计?

EvoDiff是一个基于离散扩散模型的蛋白质序列与进化比对生成框架,通过结合进化尺度数据与扩散模型的条件控制能力,实现可控的蛋白质序列空间设计。该框架提供了OADM(Order-Agnostic Autoregressive Diffusion)和D3PM(Discrete Denoising Diffusion Probabilistic Models)两种核心扩散方案,能够生成高保真、多样化且

gitblog_00676的博客 1114
上一篇: d2l 文本预处理textDataset
下一篇: d2l从零与简洁实现RNN
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值