動手學深度學習(Pytorch版)代碼實踐 -循環神經網絡-53語言模型和數據集

53語言模型和數據集

1.自然語言統計

引入庫和讀取數據:

import random
import torch
from d2l import torch as d2l
import liliPytorch as lp
import numpy as np
import matplotlib.pyplot as plttokens = 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 和 bcorpus = 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_sizefor 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 和 boffset = random.randint(0, num_steps-1)# 根據偏移量和批量大小計算出可以使用的令牌數量,確保所有批次中的樣本數量一致num_tokens = ((len(corpus) - offset - 1) // batch_size) * batch_sizeXs = 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_stepsfor 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_randomelse:self.data_iter_fn = seq_data_iter_sequentialself.corpus, self.vocab = lp.load_corpus_time_machine(max_tokens)self.batch_size, self.num_steps = batch_size, num_stepsdef __iter__(self):return self.data_iter_fn(self.corpus, self.batch_size, self.num_steps)def load_data_time_machine(batch_size, num_steps,  #@saveuse_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.pswp.cn/web/40579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40579.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40579.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

類和對象深入理解

目錄 static成員概念靜態成員變量面試題補充代碼1代碼2代碼3如何訪問private中的成員變量 靜態成員函數靜態成員函數沒有this指針 特性 友元友元函數友元類 內部類特性1特性2 匿名對象拷貝對象時的一些編譯器優化 感謝各位大佬對我的支持,如果我的文章對你有用,歡迎點擊以下鏈接…

Linux-DNS

DNS域名解析服務 1.DNS介紹 DNS 是域名系統 (Domain Name System) 的縮寫,是因特網的一項核心服務,它作為可以將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。…

大氣熱力學(2)——熱力學基礎

本篇文章源自我在 2021 年暑假自學大氣物理相關知識時手寫的筆記,現轉化為電子版本以作存檔。相較于手寫筆記,電子版的部分內容有補充和修改。筆記內容大部分為公式的推導過程。 文章目錄 2.0 本文所用符號一覽2.1 準靜態過程2.2 熱量和熱容量2.2.1 熱量…

Java對象

面向對象和面向過程的區別 兩者的主要區別在于解決問題的方式不同 面向過程把解決問題的過程拆成一個個方法,通過一個個方法的執行解決問題。 面向對象會先抽象出對象,然后用對象執行方法的方式解決問題。 另外,面向對象開發的程序一般更易維…

乞丐傳武功

題目 你施舍給了路邊的乞丐兩個饅頭,誰料這個乞丐其實是隱士高人。為了回報你的善心,只見他緩緩從懷中掏出了數本武功秘籍,讓你從中挑選一本。你珍重地接過這些秘籍,目光掃過每本封面,降龍十八掌、神照經、易筋經、凌…

[FreeRTOS 基礎知識] 互斥量 概念

文章目錄 基礎知識互斥量互斥量與信號量區別優先級反轉優先級繼承小結 基礎知識 [FreeRTOS 基礎知識] 信號量 概念 互斥量 互斥量(Mutex,全稱:Mutual Exclusion),在計算機科學中,是一種用于防止多個進程同…

科研繪圖系列:R語言實驗結果組圖(linechart + barplot)

介紹 實驗結果的多樣性意味著每個結果都可能揭示研究的不同方面或角度。在科學研究和數據分析中,通常我們會收集一系列數據點,每個數據點都對應著實驗的一個特定變量或條件。為了全面理解這些數據,我們可能會采用多種可視化技術來展示它們。 將多個結果分別可視化,可以讓…

親子時光里的打臉高手,賈乃亮與甜馨的父愛如山

賈乃亮這波操作,簡直是“實力打臉”界的MVP啊! 7月5號,他一甩手,甩出張合照, 瞬間讓多少猜測紛飛的小伙伴直呼:“臉疼不?”帶著咱家小甜心甜馨, 回了哈爾濱老家,這趟親…

Nginx(http配置、https配置)訪問Spring Boot 項目

前文 記錄一下在linux服務器下配置nginx中nginx.conf文件代理訪問springboot項目 1. spring boot.yml配置 其他mysql,redis,mybatis等之類的配置就不一一列出了 # 自定義配置 為了等下驗證讀取的配置文件環境 appName: productserver:port: 8083 # 應用服務 WEB 訪問端口s…

SQL窗口函數詳解

詳細說明在sql中窗口函數是什么,為什么需要窗口函數,有普通的聚合函數了那窗口函數的意義在哪,窗口函數的執行邏輯是什么,over中的字句是如何使用和理解的(是不是句句戳到你的痛點,哼哼~&#x…

C語言編譯和編譯預處理

編譯預處理 ? 編譯是指把高級語言編寫的源程序翻譯成計算機可識別的二進制程序(目標程序)的過程,它由編譯程序完成。 ? 編譯預處理是指在編譯之前所作的處理工作,它由編譯預處理程序完成 在對一個源程序進行編譯時,…

全國青少年軟件編程等級考試-四級-奇偶之和(真題)

題目:奇偶之和 1.準備工作 (1)保留舞臺中的小貓角色; 2.功能實現 (1)分別計算1~100中,奇數之和,偶數之和; (2)說出奇數之和,偶數之和。 講解: 1、如何判斷奇偶數 奇數是指除以2有…

C++deque容器

文章目錄 deque容器概念deque操作deque對象的帶參數構造deque頭部和末尾的添加移除操作deque的數據存取deque與迭代器deque賦值deque插入deque刪除 deque容器概念 deque是雙端數組,而vector是單端的。 ?deque頭部和尾部添加或移除元素都非常快速, 但是在中部安插元…

在x86/amd64的機器上使用Docker運行arm64v8/ubuntu并安裝ROS1

一、準備工作 主要是因為國內網絡的問題,可能導致鏡像拉取失敗,解決辦法參考:鏡像加速 二、安裝運行過程 2.1拉取鏡像: sudo docker pull arm64v8/ubuntu:20.04這個是ubuntu的拉取指令,其他的也是類似。 2.2 運行…

【DevOps】運維過程中經常遇到的Http錯誤碼問題分析(一)

一、解決HTTP 408錯誤:上傳3M文件時請求超時的問題 在開發Web應用程序時,遇到HTTP 408狀態碼(請求超時)是常見的問題。特別是在上傳大文件時,這種情況更容易發生。本文將探討在上傳一個3M文件時,Web服務器…

LeetCode題練習與總結:排序鏈表--148

一、題目描述 給你鏈表的頭結點 head ,請將其按 升序 排列并返回 排序后的鏈表 。 示例 1: 輸入:head [4,2,1,3] 輸出:[1,2,3,4]示例 2: 輸入:head [-1,5,3,4,0] 輸出:[-1,0,3,4,5]示例 3&am…

封鎖-封鎖模式(共享鎖、排他鎖)、封鎖協議(兩階段封鎖協議)

一、引言 1、封鎖技術是目前大多數商用DBMS采用的并發控制技術,封鎖技術通過在數據庫對象上維護鎖來實現并發事務非串行調度的沖突可串行化 2、基于鎖的并發控制的基本思想是: 當一個事務對需要訪問的數據庫對象,例如關系、元組等進行操作…

【嵌入式開發 Linux 常用命令系列 1.6 -- grep 過濾指定的目錄】

請閱讀【嵌入式開發學習必備專欄 】 文章目錄 grep 過濾指定目錄 grep 過濾指定目錄 在Linux中使用grep搜索字符串并希望排除特定目錄時,可以使用--exclude-dir參數。這個參數允許你指定一個或多個目錄名稱來排除它們的內容不被grep搜索。這對于忽略一些常見的臨時…

LLM - 詞向量 Word2vec

1. 詞向量是一個詞的低維表示,詞向量可以反應語言的一些規律,詞意相近的詞向量之間近乎于平行。 2. 詞向量的實現: (1)首先使用滑動窗口來構造數據,一個滑動窗口是指在一段文本中連續出現的幾個單詞&#x…

llamaindex實戰-使用本地大模型和數據庫對話

概述 本文使用NLSQLTableQueryEngine 查詢引擎來構建SQL的自然語言處理查詢。 請注意,我們需要指定要與該查詢引擎一起使用的表。如果我們不這樣做,查詢引擎將提取所有架構上下文,這可能會溢出 LLM 的上下文窗口。 在以下情況都可以使用NL…