动手学深度学习(Pytorch版)代码实践 -循环神经网络-53语言模型和数据集

news2024/11/20 2:37:20

53语言模型和数据集

1.自然语言统计

引入库和读取数据:

import random
import torch
from d2l import torch as d2l
import liliPytorch as lp
import numpy as np
import matplotlib.pyplot as plt

tokens = lp.tokenize(lp.read_time_machine())

一元语法:

# 一元语法
# 因为每个文本行不一定是一个句子或一个段落,因此我们把所有文本行拼接到一起
corpus = [token for line in tokens for token in line]
vocab = lp.Vocab(corpus)
# print(vocab.token_freqs[:5])
# [('the', 2261), ('i', 1267), ('and', 1245), ('of', 1155), ('a', 816)]
freqs = [freq for token, freq in vocab.token_freqs]
d2l.plot(freqs, xlabel='token: x', ylabel='frequency: n(x)',
         xscale='log', yscale='log')
plt.show()

在这里插入图片描述

二元语法:

# 二元语法
bigram_tokens = [pair for pair in zip(corpus[:-1], corpus[1:])]
bigram_vocab = lp.Vocab(bigram_tokens)
# print(bigram_vocab.token_freqs[:5])
# [(('of', 'the'), 309), (('in', 'the'), 169), (('i', 'had'), 130),
# (('i', 'was'), 112), (('and', 'the'), 109)]
freqs = [freq for token, freq in bigram_vocab.token_freqs]
d2l.plot(freqs, xlabel='token: x', ylabel='frequency: n(x)',
         xscale='log', yscale='log')
plt.show()

在这里插入图片描述

三元语法:

# 三元语法
trigram_tokens = [triple for triple in zip(corpus[:-2], corpus[1:-1], corpus[2:])]
trigram_vocab = lp.Vocab(trigram_tokens)
# print(trigram_vocab.token_freqs[:5])
# [(('the', 'time', 'traveller'), 59), (('the', 'time', 'machine'), 30), (('the', 'medical', 'man'), 24),
#  (('it', 'seemed', 'to'), 16), (('it', 'was', 'a'), 15)]
freqs = [freq for token, freq in trigram_vocab.token_freqs]
d2l.plot(freqs, xlabel='token: x', ylabel='frequency: n(x)',
         xscale='log', yscale='log')
plt.show()

在这里插入图片描述
对比:

# 一元语法、二元语法和三元语法对比
freqs = [freq for token, freq in vocab.token_freqs]
bigram_freqs = [freq for token, freq in bigram_vocab.token_freqs]
trigram_freqs = [freq for token, freq in trigram_vocab.token_freqs]
d2l.plot([freqs, bigram_freqs, trigram_freqs], xlabel='token: x',
         ylabel='frequency: n(x)', xscale='log', yscale='log',
         legend=['unigram', 'bigram', 'trigram'])
plt.show()

在这里插入图片描述

2.读取长序列数据
# n元语法,n 等于 num_steps
# 读取长序列数据
# 随机采样
def seq_data_iter_random(corpus, batch_size, num_steps):  #@save
    """使用随机抽样生成一个小批量子序列"""
    # 从随机偏移量开始对序列进行分区,随机范围包括num_steps-1
    # 从一个随机位置开始截取corpus,以生成一个新的子列表
    # random.randint(a, b) 会生成一个范围在 a 到 b 之间的整数,并且包括 a 和 b
    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 np.array(X), np.array(Y)

my_seq = list(range(35))
# for X, Y in seq_data_iter_random(my_seq, batch_size=3, num_steps=5):
#     print('X: ', X, '\nY:', Y)
"""
X:  [[14 15 16 17 18]
 [19 20 21 22 23]
 [ 9 10 11 12 13]]
Y: [[15 16 17 18 19]
 [20 21 22 23 24]
 [10 11 12 13 14]]
X:  [[24 25 26 27 28]
 [29 30 31 32 33]
 [ 4  5  6  7  8]]
Y: [[25 26 27 28 29]
 [30 31 32 33 34]
 [ 5  6  7  8  9]]
"""

# 顺序分区
def seq_data_iter_sequential(corpus, batch_size, num_steps):  #@save
    """使用顺序分区生成一个小批量子序列"""
    # 从随机偏移量开始划分序列
    # random.randint(a, b) 会生成一个范围在 a 到 b 之间的整数,并且包括 a 和 b
    offset = random.randint(0, num_steps-1)
    # 根据偏移量和批量大小计算出可以使用的令牌数量,确保所有批次中的样本数量一致
    num_tokens = ((len(corpus) - offset - 1) // batch_size) * batch_size
    Xs = np.array(corpus[offset: offset + num_tokens]) # 数组
    Ys = np.array(corpus[offset + 1: offset + 1 + num_tokens])
    Xs, Ys = Xs.reshape(batch_size, -1), Ys.reshape(batch_size, -1)
    # print(Xs)
    #  [[ 4  5  6  7  8  9 10 11 12 13 14 15 16 17 18]
    #   [19 20 21 22 23 24 25 26 27 28 29 30 31 32 33]]
    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

# for X, Y in seq_data_iter_sequential(my_seq, batch_size=2, num_steps=5):
#     print('X: ', X, '\nY:', Y)
"""
X:  [[ 4  5  6  7  8]
 [19 20 21 22 23]]
Y: [[ 5  6  7  8  9]
 [20 21 22 23 24]]
X:  [[ 9 10 11 12 13]
 [24 25 26 27 28]]
Y: [[10 11 12 13 14]
 [25 26 27 28 29]]
X:  [[14 15 16 17 18]
 [29 30 31 32 33]]
Y: [[15 16 17 18 19]
 [30 31 32 33 34]]
"""

# 将上面的两个采样函数包装到一个类中, 以便稍后可以将其用作数据迭代器。
class SeqDataLoader:  #@save
    """加载序列数据的迭代器"""
    def __init__(self, batch_size, num_steps, use_random_iter, max_tokens):
        if use_random_iter:
            self.data_iter_fn = seq_data_iter_random
        else:
            self.data_iter_fn = seq_data_iter_sequential
        self.corpus, self.vocab = lp.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)
    

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

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

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

相关文章

FreeBSD@ThinkPad x250因电池耗尽关机后无法启动的问题存档

好几次碰到电池耗尽FreeBSD关机,再启动,网络通了之后到了该出Xwindows窗体的时候,屏幕灭掉,网络不通,只有风扇在响,启动失败。关键是长按开关键后再次开机,还是启动失败。 偶尔有时候重启到单人…

前端面试题16(跨域问题)

跨域问题源于浏览器的同源策略(Same-origin policy),这一策略限制了来自不同源的“写”操作(比如更新、删除数据等),同时也限制了读操作。当一个网页尝试请求与自身来源不同的资源时,浏览器会阻…

Redis基础教程(七):redis列表(List)

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

Python酷库之旅-第三方库Pandas(005)

目录 一、用法精讲 7、pandas.read_clipboard函数 7-1、语法 7-2、参数 7-3、功能 7-4、返回值 7-5、说明 7-6、用法 7-6-1、代码示例 7-6-2、结果输出 8、pandas.DataFrame.to_clipboard函数 8-1、语法 8-2、参数 8-3、功能 8-4、返回值 8-5、说明 8-6、用法…

LivePortrait:一张照片生成生动视频,精准操控眼睛和嘴唇动作 本地一键整合包下载

LivePortrait,这个名字听起来就像是魔法,但它其实是现实世界中的黑科技。想象一下,你那尘封已久的相册里,那些定格在时间里的笑脸,突然间动了起来,眨眼、微笑、甚至说话,这不再是电影里的场景&a…

三相感应电机的建模仿真(2)基于ABC相坐标系S-Fun的仿真模型

1. 概述 2. 三相感应电动机状态方程式 3. 基于S-Function的仿真模型建立 4. 瞬态分析实例 5. 总结 6. 参考文献 1. 概述 前面建立的三相感应电机在ABC相坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时…

DAY20-力扣刷题

1.填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) 方法一:层次遍历 class Solution {public Node connect(Node root) {if (root null) {return root;}// 初始化队列同时将第一层节点加入队列…

【网络管理工具】NETworkManager工具的基本使用教程

【网络管理工具】NETworkManager工具的基本使用教程 一、NETworkManager工具介绍1.1 NETworkManager简介1.2 NETworkManager特点1.3 NETworkManager使用场景 二、下载NETworkManager软件包2.1 下载地址2.2 下载软件 三、运行NETworkManager工具3.1 解压NETworkManager3.2 运行N…

搭建排查tomcat内存溢出问题的调试环境

上个月赶工上线的门户网站,由于种种原因导致部署到线上服务器后每隔一段时间后就会导致tomcat内存溢出,今天我就要来直面这个棘手的问题。 要解决的问题对我来说还是有点难度的,原因有二: 代码不是我写的;我对java并不…

【操作与配置】VSCode配置Python及Jupyter

Python环境配置 可以参见:【操作与配置】Python:CondaPycharm_pycharmconda-CSDN博客 官网下载Python:http://www.python.org/download/官网下载Conda:Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

14-28 剑和诗人2 - 高性能编程Bend和Mojo

介绍: 在不断发展的计算世界中,软件和硬件之间的界限变得越来越模糊。随着我们不断突破技术可能性的界限,对能够利用现代硬件功能的高效、可扩展的编程语言的需求从未如此迫切。 Bend和 Mojo是编程语言领域的两种新秀,它们有望弥…

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型20240705

HumbleBundle7月虚幻捆绑包30件军事题材美术模型沙漠自然环境大逃杀模块化建筑可定制武器包二战现代坦克飞机道具丧尸士兵角色模型202407051607 这次HumbleBundle捆绑包是UE虚幻军事题材的,内容非常多。 有军事基地、赛博朋克街区、灌木丛景观环境等 HB捆绑包虚幻…

【Python】基于KMeans的航空公司客户数据聚类分析

💐大家好!我是码银~,欢迎关注💐: CSDN:码银 公众号:码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…

springboot 社区垃圾回收处理小程序-计算机毕业设计源码71905

摘要 在数字化高速发展的今天,随着Spring Boot等轻量级框架的广泛应用,各种小程序、微服务如雨后春笋般涌现,极大地丰富了我们的软件生态系统。然而,伴随着这些应用的迅速增加,垃圾回收处理成为了一个不可忽视的问题。…

Mybatis原生使用

一、MyBatis初次使用 2.1 环境搭建步骤 MyBatis 的 API : https://mybatis.org/mybatis-3/zh/getting-started.html 1.引入依赖包 2.准备核心配置件 db.properties drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://123.57.206.19:3306/demo?useUnicodetrue&am…

步进电机改伺服电机

步进电机: 42:轴径5mm 57:轴径8mm 86:轴径14mm 【86CME120闭环】// 12牛米 伺服电机: 40: 60: 80: 86: ECMA——C 1 0910 R S 4.25A 轴径…

26.5 Django模板层

1. 模版介绍 在Django中, 模板(Templates)主要用于动态地生成HTML页面. 当需要基于某些数据(如用户信息, 数据库查询结果等)来动态地渲染HTML页面时, 就会使用到模板.以下是模板在Django中使用的几个关键场景: * 1. 动态内容生成: 当需要根据数据库中的数据或其他动态数据来生…

Hook 实现 Windows 系统热键屏蔽(二)

目录 前言 一、介绍用户账户控制(UAC) 1.1 什么是 UAC ? 2.2 UAC 运行机制的概述 2.3 分析 UAC 提权参数 二、 NdrAsyncServerCall 函数的分析 2.1 函数声明的解析 2.2 对 Winlogon 的逆向 2.3 对 rpcrt4 的静态分析 2.4 对 rpcrt4…

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT 对话情绪识别

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT对话情绪识别 近期确实太忙,此处仅作简单记录: 模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Transformers)&#xff0c…

14-32 剑和诗人6 - GenAI 重塑 SRE 和云工程实践

在不断发展的软件开发和运营领域,各种学科的融合催生了新的范式和实践,旨在简化流程、加强协作和推动创新。DevSecOps、站点可靠性工程 (SRE)、平台工程和云工程已成为支持现代软件系统的重要支柱,每个支柱都解决了独特的挑战和要求。 然而&…