动手学bert课程笔记

5 篇文章 0 订阅
2 篇文章 0 订阅

模仿每个py文件下的定义的方法以及类,定义的顺序,分成多个py文件的一些其他的代码思想。比如,main.py中干了什么事情,Dataset部分干了什么事,如何做的,为什么要这么做?每个方法和类传入的是什么,传出的是什么?

1.本节代码最大的收获就是动态调用模型,也就是把每个模型的公共数据放到一个py文件,我们直接调用py文件即可,以及
2.true = labels.data.cpu()
predit = torch.max(outputs.data, 1)[1].cpu()
train_acc = metrics.accuracy_score(true, predit)
report = metrics.classification_report(labels_all, predict_all, target_names=config.class_list, digits=4)
confusion = metrics.confusion_matrix(labels_all, predict_all)
上述都是sklearn中的方法,极大节约了我们重写代码的时间。

3.知道了train.py文件中test,evaluate,test到底是做什么的。里面的模型的保存方式,还有如果模型不再提升那么我们如何跳出训练。
4.本节就是学会如何模仿。
5.bert预训练的一些基础的使用方法。

目录

1.pytorch下面有一个pre_trained里面的东西是官方给定的,在tokenizion中可以更改各个与训练模型的下载的地址,过多的就不要改了。在构建模型的时候,导入我们的bert模型和分词器。
在这里插入图片描述
直接在构建模型时候使用BertModel即可。这一层相当与于我们的embedding层,为数据分配词向量。在这里插入图片描述

2.我们已经下载好的预训练模型直接加载即可
在这里插入图片描述

3.我们在使用bert的时候,写forward当我们不知道数据的形式什么样的时候,我们就点进去源码,看看对于该模型的输入输出的要求在这里插入图片描述
这里的x是什么?传进bert都需要什么?x就是什么
在这里插入图片描述
上图就是模型的输入输出的要求。在这里插入图片描述
在这里插入图片描述
此处需要写bert的前向传播,直接点进去self.bert,复制前向传播的参数即可。
在这里插入图片描述
在这里插入图片描述
模型初步写完我们需要调整一下维度。在这里是context和mask的维度,需要传进模型中,所以我们进入模型来看一下维度。
在这里插入图片描述
我们需要计算维度。
在这里插入图片描述

python动态导入

from import import_module
model_name=args.model
x=import_module('models.'+model_name)

这种办法一个优点是,在我们写好数据预处理,main等东西直接更换模型的名称即可直接改变我们所加载的模型。
在这里插入图片描述

随即种子

    np.random.seed(1)
    torch.manual_seed(1)
    torch.cuda.manual_seed_all(4)
    torch.backends.cudnn.deterministic = True #保证每次运行结果一样

Dataset

重写Dataset是文本处理的最重要的部分

Dataset的任务就是可以视为加载数据,数据预处理(分词,清洗,构建词典,padding ,构建出我们模型所需要的数据格式),对于构建成我们的数据形式这步至关重要,在此处我们模型(bert)需要的是四个列表。如果要变成maml的数据的话我们就需要将其在此步骤中进行转换,将我们的数据传入Dataloader中。
在这里插入图片描述

我们其实可以注意到,构建Dataset的过程分成两个部分,第一步是build_dataset,第二步是load_dataset。具体的处理都放在第二步的load_dataset中。第一步有两个作用将地址给第二步的方法得到第二个方法返回的数据,称为traintestdev,将此传给Dataloader先build一个方法(def load_dataset),再调用构建的这个方法(def build_dataset)。
在这里插入图片描述

Dataloader

官方Dataloader的参数,参考https://www.jianshu.com/p/ecd4549a5819

如果直接使用pytorch的Dataloader我们要注意他的输入是什么。所以自己的数据集都要自己构造Dataloader或者调整dataset的格式。
在这里插入图片描述
看一看此处dataset的格式。观察是什么样的数据可以直接传入pytorch的Dataloader中。

我们在此定义的Dataloader是一个很简单的Dataloader,没有GPU加速等功能。
在Dataloader中的判断批次数是否为整数,所以声明一个self.residue,__next__进行构造

在这里插入图片描述
这些self中的参数是如何使用的?

Dataloader中学到的东西:
1.知道了def __next__(self):中的东西,如果自己写的话可能只会有,小于n_batches的情况,在这里插入图片描述
不会写else和最后一次迭代的情况。在这里插入图片描述

2.包括self.indexself.n_batchesself.residue的定义以及使用方法。自己写的话就是只会传入dataset和batch_size,其他的实例变量想不到。
在这里插入图片描述

3.以及传入的dataset的格式,在此处构建to_tensor的时候需要使用。
4.还有这几种实例方法的使用,以及理解,如果之前自己,完全写不出来dataloader的方法,甚至里面有几种方法都不知道。
5.还有在dataloader类中将数据转成tensor形式以便传入我们的模型,这里我们也就知道我们的代码都是服务于我们的目的,下一步需要什么我们就构造什么一步一步来即可,也就是说转换成tensor的方法在dataset中也可以使用,但是将所有东西放在一起太过冗余,dataset的任务就是可以视为加载数据,数据预处理(分词,清洗,构建词典,构建出我们模型所需要的数据格式)。Dataloder就是构建batch,转换成tensor。

6.在这里插入图片描述
如果自己构造batch时候返回的是这种形式的东西是不知道的。尤其是括号括起来前几个,留下最后一个y。
调用Dataloader和Dataset都是相同的分成两步。
在这里插入图片描述

训练

有些参数需要衰减,有些参数不需要衰减。

声明了几个新的变量
在这里插入图片描述

训练的过程中
计算acc的方法。终止条件,若干次效果没有提升我们就退出。torch.max,metrics.accuracy_score方法.在这里插入图片描述
在训练中直接进行验证,并且不用声明新的方法。

而且直接连接到验证集上,对验证集进行一个测试,来评判dev_loss。每次模型的提升都对其进行一次保存,来判断是否我们的模型不会继续提升。在这里插入图片描述
在这里保存为cpu的原因就是我们要用到线面的那个metrics的方法。他是在cpu上运行同时放到cpu上也可以解放我们的GPU。以及torch.save保存模型的方法。np.append方法。

函数np.append(arr, values, axis=None)
作用:
为原始array添加一些values
参数:
arr:需要被添加values的数组
values:添加到数组arr中的值

验证的方法就是求出loss,和acc,acc是根据label和predict来计算。验证就是训练的简略版本,此处放到了numpy中去计算。构建混淆矩阵的方法confusion=metrics.classification_matrix(labels_all,predicts_all)。测试test直接用验证的就可以,传入test=True即可。

config模型配置类

列表生成式中可以直接打开文件,并读取

[for x in open().readlines()]

模型构建类

  • 参数不变
    如要不变就需要False
  • 参数改变叫fine-tune

在这里插入图片描述

训练

训练的时候三次model.train()的启动位置。在这里插入图片描述
在这里插入图片描述
最后一次model.train()启动是因为我们在前面调用了一次那个evaluate所以我们会进行一次调用model.evaluate(),所以他的后面还要进行一次model.train()。在。干什么的时候我们就要声明什么。进行训练的话就是model.train(),进行评估的话就是model.evaluate()。
在这里插入图片描述
test就是调用一次evaluate,看一看test里面都做了什么事情。

好的方法

metrics.classification_report

classification_report 在报告中显示每个类的精确度,召回率,F1值等信息

    report = metrics.classification_report(labels_all, predict_all, target_names=config.class_list, digits=4)

加载模型,用于test集

model.load_state_dict(torch.load(config.save_path))

加载地址的格式

self.save_path=dataset+’/saved_dict’+self.model_name+’.ckpt’
注意那个’.'和‘/’的位置。

加载优化

在这里插入图片描述

在这里插入图片描述

代码规范

1.为什么要书写我们的config类,对于python进行多值传参的时候,将config中的数据传入ini太过冗余,所以我们可以把数据放在一个类中,直接调用即可。
在这里插入图片描述
“Dropout”应用于倒数第二层的输入。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值