bert源码解读
唐僧爱吃唐僧肉
这个作者很懒,什么都没留下…
展开
-
transformer t5 relative position代码解读
T5模型的调用T5Attention类别的调用T5Attention类别的调用首先查看一下初始化参数的值self.has_relative_attention_bias = Falseself.relative_attention_num_buckets = 32self.d_model = 512self.key_value_proj_dim = 64self.inner_dim = 512接着进入forward调用程序部分batch_size,seq_length = hidden_原创 2022-07-07 18:35:06 · 3539 阅读 · 6 评论 -
GPT和GPT2结构的区别
GPT1结构图如下所示:GPT2结构图如下:注意,GPT2的最后一个LayerNorm在24个transformers或是12个transformers结构之后添加的,这里layernormalization放在前面类似于预激活函数的设定,在另外一篇文章Identity mappings in deepresidual networks.这里在Idenity mapping in deep residual networks之中有推导过程,这里简单的写一下原始残差单元计算公式如下:yl=h(x原创 2022-05-29 20:54:29 · 982 阅读 · 1 评论 -
longformer代码结构解读
Longformer模型难点解读_sliding_chunks_query_key_matmul函数之中的结构变换longformer在延伸maxlen的同时,结构上也存在着很多的难点,这里逐步分析出来。_sliding_chunks_query_key_matmul函数之中的结构变换这里最难懂的是这样的几句query_size = list(query.size())query_size[1] = query_size[1]*2-1query_stride = list(query.strid原创 2022-02-12 22:40:10 · 2124 阅读 · 0 评论 -
huggingface中的tokenizer切词offset_mapping作用
huggingface之中的tokenizer切词之后,得到的offset_mapping标志着每次切出来的单词对应着第几个字母,这里截取出来的结果如下:text: "80 % of Americans believe seeking multiple opinions can help them make offset_mapping:(0,2) (2,3) (4,6) (7,16) (17原创 2022-01-28 22:54:05 · 3131 阅读 · 2 评论 -
ema权重平均深度学习使用
ema权重平均pytorch实现class EMA(): def __init__(self, decay): self.decay = decay self.shadow = {} def register(self, name, val): self.shadow[name] = val.clone() def get(self, name): return self.shadow[name]原创 2021-12-28 22:11:31 · 1109 阅读 · 0 评论 -
plot绘制图示例
以下代码可以替换为计算时长长度的部分# 展现不同电影的时长分布状态plt.figure(figsize=(20, 8), dpi=100)# 准备时长数据time =[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 12原创 2021-12-11 19:44:27 · 350 阅读 · 0 评论 -
总结篇:t5 transformers整体的结构流程图
为了更好地理解t5模型结构的内容,这里给出t5模型的整体结构流程t5整体模型结构流程t5整体的结构流程6个encoder部分的layerselfattention第一次调用6个decoder部分的layerselfattention第一次调用6个decoder部分的layercrossattention第二次调用6个decoder部分的layerselfattention第二次调用6个decoder部分的layercrossattentiont5整体的结构流程t5在运行的过程中,主要改变的就是key_原创 2021-12-01 10:46:37 · 3717 阅读 · 0 评论 -
transformers之中mt5和t5的区别
为了查看transformers结构之中mt5结构和t5结构的区别,这里采用代码对比法,相同的程序分别调用mt5结构和t5结构使用mt5的结构from transformers import T5Tokenizer, T5ForConditionalGenerationtokenizer = T5Tokenizer.from_pretrained("/home/xiaoguzai/模型/mt5-base")model = T5ForConditionalGeneration.from_pretrai原创 2021-11-30 21:04:52 · 3687 阅读 · 2 评论 -
mt5模型从spiece.model中找寻出vocab
mt5模型文件地址mt5模型由于vocab词汇表中的词汇过多,采用从spiece.model之中读取的方式,读取过程如下import sentencepiece as spmspm_path = '/home/xiaoguzai/模型/mt5/spiece.model'# 加载训练好的模型,切分文本sp = spm.SentencePieceProcessor(model_file=spm_path)# 编码 text -> idresult = sp.encode(['This i原创 2021-11-30 18:51:55 · 1682 阅读 · 1 评论 -
终结篇:t5模型结构的阅读
问题关键:past_key_value模型的整体结构(由外到内)最外层generation_utils.py之中的greedy_search调用模型解读t5Stack模型的解读通过之前对于代码的阅读,发现问题的关键就在于past_key_value参数的变化,导致输入不需要那么复杂的输入了,模型的整体结构(由外到内)模型的整体结构决定着数据的运转方向模型整体的框架结构图最外层generation_utils.py之中的greedy_search调用模型解读while True: i原创 2021-11-30 02:00:00 · 3257 阅读 · 0 评论 -
总结:阅读transformer结构的t5源代码的经验
阅读transformers中的t5结构经验1.用笔在纸上画出结构,哪一部分接着跟着哪一部分2.把握关键的操作3.刚开始按顺序读代码,把握脉络之后抓住重点的结构对于代码的改变1.用笔在纸上画出结构,哪一部分接着跟着哪一部分因为t5总体的结构比较复杂,所以必须使用纸和笔画出结构之后,画出每一部位结构进行的操作,读代码的过程才会更清晰2.把握关键的操作比如在attention之中重点就是key和value对于原来值的更改,所以只有把握了重点语句的操作过程,才能明白原理。3.刚开始按顺序读代码,把握脉络原创 2021-11-28 15:12:38 · 897 阅读 · 0 评论 -
transformers5--t5模型中encoder与decoder内容不同解读
t5模型中encoder与decoder内容不同查看transformers库之中的encoder和decoder部分内容的不同查看没有key_value_states以及query_length的情况下,T5Attention模型的调用过程查看transformers库之中的encoder和decoder部分内容的不同仔细观察发现,t5selfattention和t5crossattention的区别在于t5crossattention之中多加入了两个参数t5selfattention的内容sel原创 2021-11-26 20:21:17 · 6919 阅读 · 0 评论 -
transformers 模型指导文件(t5forconditionalgeneration与t5model的差异)
读transformer代码前,请先看对应的模型文件transformer t5模型指导文件转载 2021-11-25 11:46:37 · 3827 阅读 · 1 评论 -
transformer t5代码解读4(主要内容bert4keras实现t5模型)
继续解读t5代码之中源码的内容回到t5的整体结构之中回到t5的整体结构之中回到t5模型的整体的结构之中(0): T5LayerSelfAttention( (SelfAttention): T5Attention( (q): Linear(in_features=512, out_features=512, bias=False) (k): Linear(in_features=512, out_features=512,原创 2021-11-24 22:19:15 · 2452 阅读 · 0 评论 -
word2vec方法代码学习
word2vec内容链接word2vec代码内容如下:import numpy as npfrom collections import defaultdict class word2vec(): def __init__(self): self.n = settings['n'] self.lr = settings['learning_rate'] self.epochs = settings['epochs']原创 2021-11-23 22:23:23 · 1403 阅读 · 0 评论 -
调用t5模型的过程
transformer调用t5模型过程的代码from transformers import T5Tokenizer, T5ForConditionalGenerationtokenizer = T5Tokenizer.from_pretrained("t5-small")model = T5ForConditionalGeneration.from_pretrained("t5-small")input_ids = tokenizer('translate English to German:原创 2021-11-13 10:15:53 · 5076 阅读 · 1 评论 -
小布助手对话短文本语义匹配阅读源代码1--build_vocab.py understand
小布助手对话短文本语义匹配对于大佬这段代码的解读首先进入build_vocab.py之中,查看形成词表的过程关键代码counts = [3,5,3,3,5,5]接下来调用词频形成新的vocab.txt的词表过程(由于数据是脱敏的,这里考虑词语出现的频率,即词频) for ch in childPath: print('file_name = ') print(modelPath+ch+'vocab.txt') r""" n原创 2021-09-10 13:11:54 · 790 阅读 · 0 评论 -
记一次错误的发现logits and labels must have the same first dimension
今天写代码的时候发现一次错误这里的模型内容定义如下:from nezha import Bertbatch_size = 48bertmodel = Bert(maxlen=max_seq_len,batch_size=batch_size,**config)input_ids1 = keras.layers.Input(shape=(None,),dtype='int32',name="token_ids1")input_ids2 = keras.layers.Input(shape=(Non原创 2021-07-20 22:36:44 · 3755 阅读 · 0 评论 -
shape = (None,3)与shape = (3,)讲解
shape = (None,3)返回的是一个二维的shape,而shape=(3,)返回的是一个一位的3个数值的shape原创 2021-07-20 17:58:57 · 4068 阅读 · 1 评论 -
Expect x to be a non-empty array or dataset错误解决
这种错误一般是数据没有达到第一个batch_size的大小进而引发的报错,也就是说数据总长度必须要达到第一个batch_size的大小的内容原创 2021-07-20 10:53:10 · 3597 阅读 · 0 评论 -
bert4keras中预训练代码阅读
bert4keras中的预训练代码如下:if model == 'roberta': print('situation roberta') import jieba_fast as jieba jieba.initialize() def word_segment(text): return jieba.lcut(text) TD = TrainingDatasetRoBERTa( tokenizer, word_segment,原创 2021-07-14 11:35:51 · 955 阅读 · 0 评论 -
python解除数组输出限制的具体操作过程
lists = tf.ones((2000,2000))import numpy as npnp.set_printoptions(threshold=20000)print(np.array(lists))注意这里np.set_printoptions解除输出限制了之后,一定要以numpy的形式输出,如果不为numpy的情况下转为numpy原创 2021-07-09 15:04:38 · 874 阅读 · 0 评论 -
预训练过程训练数据分析1
源代码地址大佬预训练代码地址模型结构之前已经进行分析过了,这里从训练过程开始分析training_args = TrainingArguments( output_dir='record', num_train_epochs=num_train_epochs, learning_rate=learning_rate, per_device_train_batch_size=batch_size, save_steps=save_steps, loggin原创 2021-07-08 11:12:31 · 1543 阅读 · 0 评论 -
Transformer中Nezha的NeZhaSelfAttention源码解读
class NeZhaSelfAttention(nn.Module): def __init__(self, config): super().__init__() if config.hidden_size % config.num_attention_heads != 0 and not hasattr(config, "embedding_size"): raise ValueError( "The hi原创 2021-06-29 10:35:05 · 329 阅读 · 0 评论 -
解读大佬github比赛的预训练的代码
大佬的预训练代码的地址如下大佬的预训练代码的地址先放出所有的pretrain.py的代码,然后进一步地进行分析解读# coding:utf-8import osimport pickleimport torchimport randomimport warningsimport numpy as npimport pandas as pdfrom tqdm import tqdmfrom typing import List, Tuple, Dictfrom collection原创 2021-06-27 22:32:43 · 1681 阅读 · 3 评论 -
为什么bert常用于采样和gpt常用于预测
今天在分析源代码的时候发现,bert常常用于采样的过程,而gpt常常用于预测的过程,对于这一机制可以通过bert和gpt的原理来进行理解。采样的过程是中间加入一个[MASK]标志,比如对于“科学是第一生产力”文本,将其中的学字用[MASK]标记出来,变成"科[MASK]是第一生产力",然后继续进行采样之后,下一步又变成"科技是第一生产力"。这与bert结构的特性有关,bert是使用的不带掩码的Transformer,所以遮盖之后再显示出来能够进行下一步的采样。而预测生成的过程是只看下一个汉字的内容,由当原创 2021-04-28 09:00:32 · 243 阅读 · 0 评论 -
为小白创作的第一个bert模型的微调过程
作为一个nlp小白,我在入门的过程之中,遇到了很多的困难和障碍,比如刚开始不知道在哪下载预训练模型文件,不知道到哪去阅读bert模型的源代码,经历了学习之后,如今我已经算是简单的入门了。为了帮助新手更好地入门bert模型,我自己写了一个bert模型的简洁的源代码,方便新手学习bert分为预训练和微调过程,这里我们只学习微调过程为了简化操作,只需要进行如下的过程安装tensorflow==2.x版本之后安装库的指令pip install bertforyou==1.1.9接下来运行下面的对应代码原创 2021-04-24 16:58:54 · 708 阅读 · 2 评论 -
运行程序发现内存不足
今天跑程序发现了如下的一个对应错误:刚开始运行的时候不知道是什么原因,没有出现最后一句刚开始我不知道是哪一句对应的语句出现了问题,于是我采用注释法注释掉相应的编程语句,发现是如下语句导致出现的问题weight_value_pairs.extend(zip(weights,values))去掉注释再次运行的时候,发现程序出现了最后一行的关键报错:/job:localhost/replica:0/task:0/device:GPU:0 with 22248MB memory也就是说对应的错误是内原创 2021-04-06 09:43:40 · 1269 阅读 · 0 评论 -
tensorflow实现部分梯度更新的操作
tensorflow实现部分梯度更新的操作原创 2021-04-03 22:00:05 · 567 阅读 · 0 评论 -
bert has a mouth can speak something模型复现思路
最近拜读了一下"bert has a mouth,and it must speak"的论文,内容是利用bert进行文本生成的任务操作,深受里面的启迪,复现了一下相应的代码,在我的github上面,地址mlm文本预测代码复现可以看出关键部分在于求出加上[MASK]标志之后当前部位各个单词对应的概率。那么问题来了,如何求出加上[MASK]标志之后对应单词的输出概率呢?首先作为预测任务,几个相应的预测权重需要使用上'bert/mlm_dense0/kernel:0':'cls/predictions/t原创 2021-04-03 20:39:01 · 223 阅读 · 0 评论 -
发布自己的python库到PyPi
这里以我的一个小的项目bertforyou为例,来介绍一下github上面如何发布属于自己的python库首先安装一下对应的twine库pip install twine接下来写一个对应的setup.py文件#!/usr/bin/env pythonfrom io import openfrom setuptools import setup, find_packagessetup( name='bertforyou', version='1.1.3', descri原创 2021-04-03 18:33:08 · 346 阅读 · 1 评论 -
深度学习改模型的小技巧
在学习深度学习模型的时候,我们经常会遇到这样的情况,就是自己仿照别人的算法写了一套模型的源代码,但是自己的模型源代码效果跟别人差很多,自己却不知道问题出在哪里,这个时候我们可以采用不训练,单向预测的方法,取一个简单的句子进行预测,然后查看中间过程的各个结果。注意事项:单向预测的时候必须在初始化的权重相同的情况下,才能对中间的结果进行比较,比较适用于有预训练过程之中微调的步骤...原创 2021-04-02 06:50:32 · 3195 阅读 · 0 评论 -
深度学习模型不收敛
当模型不收敛的时候,适当的调大batch_size,可能会得到很好的效果原创 2021-04-01 21:25:06 · 698 阅读 · 0 评论 -
tf1静态图使用predict预测函数模式
tensorflow1使用的为静态图模型,到了tensorflow2版本才改为动态图模型,那么问题来了,静态图和动态图主要有哪些区别在我看来,静态图和动态图的区别主要在于静态图当中的predict函数静态图获取输出的内容outputs = model.predict(inputs)此时静态图不会调用中间的函数,因为模型已经使用静态图部分定义好了,而动态图模型则是在预测的过程中调用前向传播函数outputs = model(inputs)此时动态图会调用模型处理的各个部分所以要想查看静态图之原创 2021-04-01 10:31:27 · 510 阅读 · 0 评论 -
使用字典类型对类赋值
使用字典可以直接对类的参数进行相应的赋值,对应的操作如下:config = {'name1':'hello1','name2':'hello2'}class layer(): def __init__(self,name1,name2,**kwargs): self.name1 = name1 self.name2 = name2layers = layer(**config)print(layers.name1)print(layers.name2)此原创 2021-03-31 22:03:56 · 452 阅读 · 0 评论 -
bert Layer Normalization中的gamma和beta参数解析
每次读到bert中的Layer Normalization层,都会疑惑其中的alpha参数和beta参数所代表的含义,今天终于读懂其中参数的含义,特此记录可以看出其中的alpha和beta代表的含义内容原创 2021-03-31 20:00:22 · 2606 阅读 · 1 评论 -
解决keras.layers.Layer之中无法定义name的问题
在使用keras之中定义层的时候,如果按照以下的方法直接在keras.layers.Layer中定义相应的self.name,会发生相应的报错import params as ppimport params_flow as pfimport tensorflow as tfimport tensorflow.keras as kerasclass MyParams(tf.keras.layers.Layer): def __init__(self): super(My原创 2021-03-30 22:29:24 · 2548 阅读 · 1 评论 -
删除阅读代码法
遇到代码不懂地方的内容,可以使用删除阅读代码法,就是将代码的某一部分注释掉或者删除,看看程序是否还能够得到正确的结果,这个方法在有一些直接由函数看不出内容的情况下使用很常见...原创 2021-03-30 20:37:54 · 57 阅读 · 0 评论 -
读取weights列表中的所有模型名称
比如我们定义好一个bertmodel的模型,当我们直接输入bertmodel.weights的时候,它会将模型名称和变量同时显示出来,非常不利于我们进行比较,所以使用下面对应的编程语句可以将模型的名称提取出来bertmodelname = []for data in bertmodel.weights: bertmodelname.append(data.name)print(bertmodelname)...原创 2021-03-25 22:04:37 · 235 阅读 · 0 评论 -
为什么说Bert结构只有编码,而transformer既有编码结构又有解码结构
初入nlp坑的学生们常常会不理解这样一个相应的问题:Bert结构只有编码,而transformer结构既有编码机制又有解码机制,想通过这篇文章来帮助大家理解一下这个问题。其实这个问题的解答很简单:因为Bert使用的transformer机制实际上是真正的transformer结构的一半。真正的transformer结构机制bert中所使用的Transformer结构机制Bert的微调操作本质上有点像cnn机制,只是把每一个结构之中换乘了相应的Transformer结构而已。...原创 2021-03-09 15:47:47 · 1371 阅读 · 0 评论