当前位置: 首页 > news >正文

nanoGPT复现——prepare拆解(自己构建词表 VS tiktoken)

在nanoGPT的data文件夹有两个很相似的文件夹结构:shakespeare和shakespeare-char,这两种都是对shakespeare数据集的处理,但是shakespeare使用的是tiktoken对文字进行编码,另一个则是使用自己构建的词表

一、shakespeare-char(自己构建词表)

数据获取

data_path = os.path.join(os.path.dirname(__file__), 'input.txt')
if not os.path.exists(data_path):url = 'https://cdn.jsdelivr.net/gh/karpathy/char-rnn@master/data/tinyshakespeare/input.txt'with open(data_path, 'w', encoding='utf-8') as f:f.write(requests.get(url).text)
with open(data_path, 'r', encoding='utf-8') as f:data = f.read()

我这里在运行的时候是没有办法直接下载的,如果出现这个情况就直接打开网址手动下载就好

构建词表

chars = sorted(list(set(data)))
stoi = {s: i for i, s in enumerate(chars)}
itos = {i: s for i, s in enumerate(chars)}def encode(x):return [stoi[s] for s in x]
def decode(l):return ''.join([itos[i] for i in l])

划分训练集和测试集

n = len(data)
train_data = data[: int(0.9 * n)]
val_data = data[int(0.9 *n):]
train_idx = encode(train_data)
val_idx = encode(val_data)

对训练集和测试集分别编码

train_idx = np.array(train_idx, dtype=np.uint16)
val_idx = np.array(val_idx, dtype=np.uint16)
train_idx.tofile(os.path.join(os.path.dirname(__file__), 'train.bin'))
val_idx.tofile(os.path.join(os.path.dirname(__file__), 'val.bin'))

保存词表为meta.pkl文件(在sample.py中会用)

meta = {'voavb_size': len(chars),'itos': itos,'stoi': stoi
}
with open(os.path.join(os.path.dirname(__file__), 'meta.pkl'), 'wb') as f:pickle.dump(meta, f)
print('finish')

二、shakespeare(利用tiktoken)

数据加载、划分数据集的部分都相同,就不再赘述了

数据编码

enc = tiktoken.get_encoding('gpt2')
train_ids = enc.encode_ordinary(train_data)
val_ids = enc.encode_ordinary(val_data)
print(f"train has {len(train_ids):,} tokens")
print(f"val has {len(val_ids):,} tokens")

保存数据

train_ids = np.array(train_ids, dtype=np.uint16)
val_ids = np.array(val_ids, dtype=np.uint16)
val_ids.tofile(os.path.join(os.path.dirname(__file__), 'val.bin'))
train_ids.tofile(os.path.join(os.path.dirname(__file__), 'train.bin'))

三、关于保存数据的几种方式对比

不知道大家发现没有,就这几十行代码中有三种文件读写方式

(1)f.write/f.read

直接读写字符串或字节流,不涉及格式解释(如txt)

(2)val_ids.tofile

原始二进制存储(如bin),但不保存shape需要提前知道数据格式

(3)pickle.dump

把任意Python对象(列表、字典、类、模型等)序列化或二进制流

http://www.dtcms.com/a/264297.html

相关文章:

  • android实践:Bugly专业版Android SDK集成
  • Docker制作python环境
  • 提示技术系列——方向性刺激提示
  • Jenkins生态与拓展:构建现代化DevOps工具链的终极指南
  • eNSP实验一:IPv4编址及IPv4路由基础
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的抖音渠道力拓展与多渠道利润增长研究
  • RESTful API 设计原则深度解析
  • STM32——代码开发顺序
  • WPF学习笔记(18)触发器Trigger
  • langchain从入门到精通(三十三)——RAG优化策略(九) MultiVector实现多向量检索文档
  • 原神八分屏角色展示页面(纯前端html,学习交流)
  • 《汇编语言:基于X86处理器》第6章 条件处理(1)
  • 每日八股文7.1
  • python-函数模块包
  • 网络基础知识与代理配置
  • 单元测试详解
  • AKAZE(Accelerated-KAZE)图像特征点检测算法详解和C++代码实现示例
  • 6.2 实现文档加载和切分和简易向量数据库的功能
  • 【在 FastAdmin 中取消特定字段的搜索功能】
  • Conda 虚拟环境克隆与 PyCharm 配置教程
  • 高阶数据结构------并查集
  • uniapp+vue3 中使用echart 以及echart文件过大需要分包的记录
  • 吸烟行为检测数据集介绍-2,108张图片 公共场所禁烟监控 健康行为研究
  • SpringCloud系列(45)--SpringCloud Bus简介
  • UE5 - 制作《塞尔达传说》中林克的技能 - 18 - 磁力抓取器
  • 强化学习【chapter0】-学习路线图
  • Java Selenium反爬虫技术方案
  • 07 Springboot+netty+mqtt服务端实现【重构】
  • 数据结构之带头双向循环链表
  • 苍穹外卖系列问题之Day11_05营业额统计代码开发2 StringUtils.join(dateList,“,“)报错