chatGPT学习---Transformer代码实现1

这里写自定义目录标题

  • 1. 创建词汇表
  • 2. 创建数据集
  • 3. Bigram语言模型
  • 4. 代码生成
  • 5. 网络训练

为了更好的理解Transformer的概念,我们可以自己动手来实现一个小型的Transformer。在这里,我们以最近大火的能写代码的chatGPT为例,自己动手写一个能写代码的小型Transformer。这部分内容大部分内存来自于Karpathy的2小时教程,主要的改动在于将他在实现细节中一些跟大家典型习惯不符合的地方,改为我们更习惯的方式。

1. 创建词汇表

我们首先需要创建一个词汇表,我在这里将我写的一个基于Yolov8的3D检测模型的所有源码,全部写到一个文本文件中,将其作为我们训练数据,这个文件大小为797K,看来Yolov8的代码量还是不小的。
在这里与Karpathy的教程中略有不同,我们把词汇表记录到AppRegistry类中,文件的组织形式为:

hwcgpt
|---core
|    |---app_registry.py
|---dss
|     |---yolo3d_ds.py
|---app_main.py

载入词汇表:

# dss/yolo3d_ds.py
class Yolo3dDs(Dataset):def __init__(self):super(Yolo3dDs, self).__init__()@staticmethoddef generate_vocab(ds_rfn: str) -> None:with open(ds_rfn, 'r', encoding='utf-8') as rfd:text = rfd.read()AppRegistry.chars = sorted(list(set(text)))AppRegistry.vocab_size = len(AppRegistry.chars)print(f'词汇表大小:{AppRegistry.vocab_size}')print('词汇表:')print(''.join(AppRegistry.chars))AppRegistry.stoi = { ch: i for i, ch in enumerate(AppRegistry.chars) }AppRegistry.itos = { i: ch for i, ch in enumerate(AppRegistry.chars) }AppRegistry.encode = lambda s: [AppRegistry.stoi[c] for c in s]AppRegistry.decode = lambda l: ''.join([AppRegistry.itos[i] for i in l])print(AppRegistry.encode('def main(arg={}):'))print(AppRegistry.decode(AppRegistry.encode('def main(arg={}):')))

执行的结果如下所示:
在这里插入图片描述

2. 创建数据集

本部分代码:

git clone https://gitee.com/yt7589/hwcgpt.git
cd hwcgpt
git checkout v0.0.2

我们假定用90%的数据作为训练集,10%的数据作为测试集,每次输入模型的长度为block_size=8,我们的任务是根据这8个单词,预测出第9个单词。
我们的数据还是yolo3d.txt,这时我们一次读入block_size+1=9个字符,前8个字符作为模型的输入,第9个字符作为模型预测输出的真值。
我们假设文本为:

REQUIREMENTS = [f'{x.name}{x.specifier}' for x in pkg.parse_requirements((PARENT / 'requirements.txt').read_text())]# 样本数据
X: [R, E, Q, U, I, R, E, M]
y: [E, Q, U, I, R, E, M, E]

我们生成的样本为:

序号Xy
1RE
2[R, E][Q]
3[R, E, Q][U]
4[R, E, Q, U][I]
5[R, E, Q, U, I][R]
6[R, E, Q, U, I, R][E]
7{R, E, Q, U, I, R, E][M]
8[R, E, Q, U, I, R, E, M][E]
程序代码如下所示:
class Yolo3dDs(Dataset):def __init__(self, ds_rfn: str):super(Yolo3dDs, self).__init__()with open(ds_rfn, 'r', encoding='utf-8') as rfd:text = rfd.read()data = torch.tensor(AppRegistry.encode(text), dtype=torch.long)# 90%作为训练集,10%作为测试集n = int(0.9*len(data))self.train_data = data[:n]self.val_data = data[n:]def disp_first_sample(self):# 取出第一个样本X = self.train_data[:AppRegistry.block_size]y = self.train_data[1:AppRegistry.block_size+1]for t in range(AppRegistry.block_size):context = X[:t+1]target = y[t]print(f'X: {context} => {target}')
# app_main.py
def main(args={}):print('最简GPT代码生成器 v0.0.1')ds_rfn = 'datasets/yolo3d.txt'Yolo3dDs.generate_vocab(ds_rfn=ds_rfn)ds = Yolo3dDs(ds_rfn=ds_rfn)ds.disp_first_sample()

运行结果为:
在这里插入图片描述
通常在实际应用中,我们都是以一个批次的形式进行训练,所以我们需要一次读入一个批次,我们设批次大小为batch=4,获取一个batch的代码如下所示:

    def disp_batch(self, Xb, yb):print(f'Xb: {Xb.shape}, yb: {yb.shape};')for b in range(AppRegistry.batch_size):print(f'batch={b}:')for t in range(AppRegistry.block_size):context = Xb[b, :t+1]target = yb[b, t]print(f'    {context} => {target};')def get_batch(self, mode: str='train') -> Tuple[torch.Tensor, torch.Tensor]:data = self.train_data if mode=='train' else self.val_data# 生成0至len(data)-AppRegistry.block_size-1之间随机数,共生成batch_size个idxs = torch.randint(len(data)-AppRegistry.block_size, (AppRegistry.batch_size,))X = torch.stack([data[i:i+AppRegistry.block_size] for i in idxs])y = torch.stack([data[i+1:i+AppRegistry.block_size+1] for i in idxs])return X, y

3. Bigram语言模型

下面我们建一个语言模型,我们看到一个单词,根据出现概率预测下一个单词,这个就是Bigramm语言模型。当然,如果我们看到更多的单词,预测下一个单词一定会更准确,但是这个就会比较复杂,由于我们是一个Hello World级别的例子,所以我们只考虑Bigramm语言模型。
我们定义并使用BigramLanguageModel:

import torch
import torch.nn as nn
from torch.nn import functional as Fclass BigramLanguageModel(nn.Module):def __init__(self, vocab_size):super().__init__()# 词汇数,单词维度self.token_embedding_table = nn.Embedding(vocab_size, vocab_size)def forward(self, idx):logits = self.token_embedding_table(idx) # (B, T, C) C=vocab_sizereturn logitsclass HwcApp(object):def __init__(self):self.name = 'hwc_app.HwcApp'
# hwc_app.py::HwcApp.startupdef startup(self, args={}):torch.manual_seed(1337)ds_rfn = 'datasets/yolo3d.txt'Yolo3dDs.generate_vocab(ds_rfn=ds_rfn)ds = Yolo3dDs(ds_rfn=ds_rfn)Xb, yb = ds.get_batch(mode='train')ds.disp_batch(Xb=Xb, yb=yb)m = BigramLanguageModel(AppRegistry.vocab_size)criterion = nn.CrossEntropyLoss()# 推理过程out = m(Xb)print(f'out: {out.shape}')B, T, C = out.shapeout = out.reshape(B*T, C)yb = yb.reshape(B*T)loss = criterion(out, yb)print(f'loss: {loss};')

完整代码请参考:

git clone https://gitee.com/yt7589/hwcgpt.git
cd hwcgpt
git checkout v0.0.3_1

在这里跟Karpathy教程中的内容有所出入,我们将计算Loss的过程放到了模型之外,同时计算Loss时使用的是nn.CrossEntropy而不是F.cross_entropy。其中B代表batch_size,T为序列长度,C为单词维主,所以out的形状打出来是(4, 8, 211)。

4. 代码生成

下面我们在模型没有经过任何学习的情况下,尝试一下代码生成。在BigramLanguageModel类中添加generate方法:

# ann/bigram_language_model.py::BigramLanguageModel.generatedef generate(self, idx, max_new_tokens):for _ in range(max_new_tokens):logits = self(idx)logits = logits[:, -1, :] # (B, T, C) => (B, C)probs = F.softmax(logits, dim=-1) # (B, C)idx_next = torch.multinomial(probs, num_samples=1)idx = torch.cat((idx, idx_next), dim=1)return idx
# hwc_app.py::HwcApp.startup
def startup(self, args={}):torch.manual_seed(1337)ds_rfn = 'datasets/yolo3d.txt'Yolo3dDs.generate_vocab(ds_rfn=ds_rfn)ds = Yolo3dDs(ds_rfn=ds_rfn)Xb, yb = ds.get_batch(mode='train')ds.disp_batch(Xb=Xb, yb=yb)m = BigramLanguageModel(AppRegistry.vocab_size)criterion = nn.CrossEntropyLoss()# 推理过程out = m(Xb)print(f'out: {out.shape}')B, T, C = out.shapeout = out.reshape(B*T, C)yb = yb.reshape(B*T)loss = criterion(out, yb)print(f'loss: {loss};')soc = torch.zeros((1, 1), dtype=torch.long) # start of sentensersts = m.generate(idx=soc, max_new_tokens=100) # (B, max_new_tokens)=(1, 100)rst = rsts[0].tolist()gen_code = AppRegistry.decode(rst)print(gen_code)
# 生成结果
?:因·S`表且数😃均N现移?未d平7~度号o因作8J2s像是       m>的高在检g表t宽Y是p偏e@        用参Q€f离距`:二差*量证F💡平无)e为w×Q'e.¡框是$置偏Rhg成N😃别/rh平方作
¡六R¨

如上所示,只是随机生成了一些无意义的字符,这是因为我们的BigramLanguageModel没有经过任何训练,只能输出随机结果。完整代码请参考:

git clone https://gitee.com/yt7589/hwcgpt.git
cd hwcgpt
git checkout v0.0.4

5. 网络训练

接下来,我们对这个简单的神经网络进行训练,然后再让其生成文本:

    def startup(self, args={}):torch.manual_seed(1337)AppRegistry.device = 'cuda' if torch.cuda.is_available() else 'cpu'# self.train()self.predict()def train(self):ds_rfn = 'datasets/yolo3d.txt'Yolo3dDs.generate_vocab(ds_rfn=ds_rfn)ds = Yolo3dDs(ds_rfn=ds_rfn)m = BigramLanguageModel(AppRegistry.vocab_size)m = m.to(AppRegistry.device)criterion = nn.CrossEntropyLoss()optimizer = torch.optim.AdamW(m.parameters(), lr=1e-3)for epoch in range(AppRegistry.epochs):X, y = ds.get_batch('train')X = X.to(AppRegistry.device)y = y.to(AppRegistry.device)y_hat = m(X)B, T, C = y_hat.shapey_hat = y_hat.reshape(B*T, C)y = y.reshape(B*T)loss = criterion(y_hat, y)optimizer.zero_grad(set_to_none=True)loss.backward()optimizer.step()print(f'{epoch}: {loss};')# 保存模型torch.save(m.state_dict(), './work/ckpts/hwc.pth')soc = torch.zeros((1, 1), dtype=torch.long).to(AppRegistry.device) # start of sentensersts = m.generate(idx=soc, max_new_tokens=100) # (B, max_new_tokens)=(1, 100)rst = rsts[0].tolist()gen_code = AppRegistry.decode(rst)print(gen_code)def predict(self):ds_rfn = 'datasets/yolo3d.txt'Yolo3dDs.generate_vocab(ds_rfn=ds_rfn)ds = Yolo3dDs(ds_rfn=ds_rfn)m = BigramLanguageModel(AppRegistry.vocab_size)m = m.to(AppRegistry.device)# 载入模型m.load_state_dict(torch.load('./work/ckpts/hwc.pth'))soc = torch.zeros((1, 1), dtype=torch.long).to(AppRegistry.device) # start of sentensersts = m.generate(idx=soc, max_new_tokens=100) # (B, max_new_tokens)=(1, 100)rst = rsts[0].tolist()gen_code = AppRegistry.decode(rst)print('生成代码:')print(gen_code)
########################## 生成结果 #######################################ayige,  nlforet[ippabonchorso  d():c,     s  =1, ='fon(xed       CARACLnddilintoraseefiseBb s[16,

上面生成的“代码”虽然依然很差,但是已经比最原始的版本强不少了,而我们训练50000个Epoch,也用不了几分钟。
完整代码请参考:

git clone https://gitee.com/yt7589/hwcgpt.git
cd hwcgpt
git checkout v0.0.5_2

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt—R语言合并站点经纬度信息并存为shp

问题概述:已有某地区站点数据,只有站点名称以及相应变量;另有较多站点数据,有站点名称,站号,经纬度信息,需要对该地区站点数据匹配站号以及经纬度信息,然后存为shp,最后叠…

写一个用r语言分层抽样算积分的代码——chatgpt版

目录 一、写一个用r语言分层抽样算积分的代码二、写一个用r语言分层抽样f(x)exp(x)算积分的代码三、写一个用r语言分别用随机投点法、平均估计法重要抽样法和分层抽样计算f(x)exp(x)积分的代码四、写一个用r语言分别用随机投点法、平均估计法重要抽样法和分层抽样计算f(x)exp(x…

当ChatGPT遇上Stable Diffusion

之前有在前面的图文和大家分享过stable diffusion--二次元福利 (qq.com),缺点就是prompt很难准确的把握,受限于自己的文字表达能力,以及中英文对照不恰当。 最近出现了让很多人都疯狂的AIGC模型ChatGPT,一个由OpenAI训练的大型语言…

FastAPI重定向给出方法不允许的错误

Fastapi渲染页面模板&#xff1a; 设置一个列表&#xff0c;放置待处理事项&#xff1a; template Jinja2Templates("pages")todos ["写日记", "看电影", "玩游戏"]设置循环体&#xff0c;对列表进行展示 <body><h1>…

遇到的一个重定向次数过多的问题

如图,次数过多一般就是死循环 当时虽然考虑过这一点 但只是在代码上做过考量 并没有想到Global会进来好多次 后来想到了 因为地址会不断刷新. 这点挺重要的,也是官网上搜了一些关于重定向的含义和使用以及区别等等才想到的. 转载于:https://www.cnblogs.com/sunshine-wy/p/7194…

访问后台出现重定向次数过多该怎么办?-建站需知

背景 在我安装使用https协议之后&#xff0c;打开后台才出现的此类情况&#xff0c;想到了几种可能的原因及解决方法&#xff0c;分享出来帮助遇到同样问题的你。 什么是重定向 重定向是一种特殊的页面&#xff0c;使得人们在输入该名称进入条目或者点击指向该名称的内部链接…

两条命令搞定 ChatGPT API 的调用问题

自2022年11月30日 OpenAI 发布 ChatGPT 以来&#xff0c;虽然时有唱衰的声音出现&#xff0c;但在OpenAI不断推陈出新&#xff0c;陆续发布了OpenAPI、GPT-4、ChatGPT Plugins之后&#xff0c;似乎让大家看到了一个聊天机器人往操作系统入口进军的升纬之路。 ChatGPT能被认为是…

xxxxx.com 将您重定向次数过多

** 重定向次数过多 ** 在C#的学习中再配置了iis站点&#xff0c;引入项目之后&#xff0c;在浏览器输入域名显示该错误&#xff0c; 首先根据提示&#xff0c;清楚缓存之后仍然没有用&#xff0c;可能是自己的Login与Main冲突&#xff0c;形成不断重定向的死循环&#xff0c;…

将您的重定向次数过多

在使用spring security框架实现安全访问控制时出现异常&#xff0c;如图&#xff1a; 这个问题的根本原因时网页跳转中出现了死循环&#xff0c;在登录项我们需要设置security“none”&#xff0c;如&#xff1a; <http pattern"/login.html" securyty"non…

ChatGPT专业应用:生成产品分析

正文共 903 字&#xff0c;阅读大约需要 5 分钟 产品经理必备技巧&#xff0c;您将在5分钟后获得以下超能力&#xff1a; 生成产品分析 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | Kim 编辑者 …

ChatGPT 的背后:OpenAI 创始人Sam Altman如何用微软的数十亿美元打造了全球最热门技术...

内容来自 MoPaaS 编者按&#xff1a; ChatGPT产生的影响还在继续&#xff0c;ChatGPT 以及其创造者 OpenAI 背后的故事却鲜为人知。OpenAI 是怎样偏离其初心坚持商业化&#xff1f;凭什么 Altman可以让微软早期押注他们? OpenAI原来的安全团队为什么分家与他们分庭抗争&#x…

李开复加入“中文版 ChatGPT”大战:宣布筹组新公司,招募世界级人才!

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 刚过去的一周&#xff0c;对于技术圈而言&#xff0c;实在是太“热闹”了&#xff1a; OpenAI 发布史上最强模型 GPT-4&#xff0c;谷歌开放大语言模型 PaLM API&#xff0c;百度「文心一言」正式亮相…

ChatGPT让Nature一周发两文探讨:学术圈使用不可避免,是时候明确使用规范

明敏 发自 凹非寺量子位 | 公众号 QbitAI 在科技巨头为了ChatGPT大打出手的另一边&#xff0c;学术圈对于ChatGPT的关注也在升高。 一周时间内&#xff0c;Nature连发两篇文章探讨ChatGPT及生成式AI。 毕竟ChatGPT最早还是在学术圈内掀起风浪&#xff0c;先后有学者拿它写论文摘…

chatgpt赋能python:用Python写优质SEO文章的方法

用Python写优质SEO文章的方法 Python语言是当前广泛应用于程序开发的最流行的高级编程语言之一。Python能够通过结构化和面向对象编程的方式&#xff0c;帮助开发者快速地开发各种类型的应用程序。但是&#xff0c;Python的使用不仅限于程序开发。最近&#xff0c;Python在SEO…

ChatGPT专业应用:撰写英文SEO文章

正文共 561 字&#xff0c;阅读大约需要 2 分钟 品牌营销/活动运营必备技巧&#xff0c;您将在2分钟后获得以下超能力&#xff1a; 快速生成英文SEO文章 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Alice 编辑者 |…

如何用Chatgpt来做SEO?分享3个技巧

目录 一、使用prompt(引导词)一键生成关键词 &#xff08;一&#xff09;案例&#xff1a;关键词调研 &#xff08;二&#xff09;案例&#xff1a;翻译关键词列表 &#xff08;三&#xff09;使用chatgpt进行关键词调研的局限性 1.真实性待验证 2.时效性有限 二、在Goo…

ChatGPT会颠覆SEO内容创作吗

近几年 AI 的发展日新月异。除了搜索算法本身大规模应用人工智能&#xff0c;我也一直关注着 AI 用于写作的进展。 上篇关于 Google 有用内容更新的帖子还在说&#xff0c;高质量内容创作是 SEO 最难的事之一&#xff0c;对某些网站来说&#xff0c;如果能有工具帮助&#xff…

「译文」用ChatGPT助力SEO工作

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 那些使用ChatGPT的先进人士&#xff0c;也没还能完全掌握它内容生成的能力&#xff0c;特别是像博客那样的长文写作能力。 现在&#xff0c;跟大家介绍 一下SEO优…

ChatGPT 辅助生成PPT

前言 介绍 ChatGPT 与 MindShow 结合高效生成 PPT。 文章目录 前言一、准备工具二、使用步骤1. 内容生成2. 制作 PPT三、小节一、准备工具 ChatGPT:MindShow:MindShow网站 MindShow 内置了丰富的模板、图表和设计元素。具有自动排版功能,可根据输入内容智能调整布局。二、使…

让chatgpt自己生成提示词的骚操作

欢迎关注微信公众号&#xff1a;小生听雨园 &#xff0c;获取最新消息&#xff0c;欢迎您的到来。 亲爱的读者您好&#xff0c;需要注意一下嗷: ChatGPT是一个自然语言处理模型&#xff0c;他不是翻译工具&#xff0c;要翻译的话可以使用deepl&#xff0c;这个的效果会更好&am…