当前位置:   article > 正文

BERT文本分类代码_来源huggingface

bert文本分类代码

BERT文本分类代码参考

数据处理

设置随机种子

模型需要提前设定随机种子和框架样式,这里的框架样式主要是指在进行卷积计算时候选择的算法。
这里的随机种子包括系统的,numpy的,torch自身的,CUDA的。

random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)  # 所有设别设置随机种子
torch.cuda.manual_seed_all(seed)  # 设置所有GPU的随机种子,如果没有GPU,会默认忽视       
  • 1
  • 2
  • 3
  • 4

在加速器cuDnn中,针对卷积有多种优化算法,不同的优化算法会对结果产生差异。

torch.backends.cudnn.deterministic = True
  • 1

True每次返回的卷积算法将是确定的,默认的,结合确定的随机种子,可以确保结果可复现,缺点是速度性能会慢。

torch.backends.cudnn.benchmark = False
  • 1

cudnn为了提升性能使用了基准测试,每次调用cuDNN卷积算法,利用基准测试找到最快的。
设置为True的条件是使用网络结构固定(非动态变化),输入变量维度固定,单一平台(不考虑跨平台带来的机器性能变化)。
注意,如果不是上述这种形式,返回结果将不是随机的。

参考资料:
复现性说明
复现性讲的非常透彻的文章

输入

输入需要载入预训练的tokenizer,tokenizer可以理解是将原本输入的词(自然语言)转化为词袋(字典)和其他内容,用于作为BERT模型的输入。
详细的tokenizer介绍可以看huggingface的tokenizer说明
默认返回的三个变量(其实是向量)分别是:

  • input_ids,就是词库字典的id
  • token_type_ids,用0,1区分输入的上下句,用[sep]隔开,返回结果如[0,0,…,0,1,1,…,1]
  • attention_mask,用1和0区分正文和padding补充,模型不会注意padding部分。

这里要注意,如果设置了max_length或者模型本身自带max_length设置(如BERT),则返回的是截断结果。如果模型本身无max_length且没有设置max_length,则padding参数无效。

这里的Tensordataset是将多个tensor向量以第一个维度为索引合并成一个矩阵。这里的第一维度就是有几个文本输入。

相关代码参考如下

    def encode_fn(self, text_list):
        """
        将text_list转化为bert可用的输入形式
        :param text_list: [string, string,...,string]
        :return: input_ids, token_type_ids, attention_mask,默认返回的三个向量
        """
        tokenizer = self.tokenizer(
            text_list,
            padding=True,
            truncation=True,
            max_length=self.max_len,
            return_tensors='pt'  # 返回的类型为pytorch tensor
        )
        input_ids = tokenizer['input_ids']  # 字典的ids
        token_type_ids = tokenizer['token_type_ids']  # 区分两个句,如[0,0,0,...,0,1,1,1,...,1]
        attention_mask = tokenizer['attention_mask']  # 0标注padding的部分,1标注正文,所以模型不会注意到这部分
        return input_ids, token_type_ids, attention_mask

    def load_data(self, path):
        """
        载入pkl文件,将数据转化为模型可接受的形式
        :param path: pkl地址
        :return: TensorData
        """
        data = pd.read_pickle(path)
        text_list, labels = list(data['content']), list(data['flag'])  #
        input_ids, token_type_ids, attention_mask = self.encode_fn(text_list)
        labels = torch.tensor(labels)  # 转化为torch下的tensor向量
        data = TensorDataset(input_ids, token_type_ids, attention_mask, labels)  # 要求第一个维度一样
        return data
  • 1
  • 2
  • 3
  • 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

DataLoader

用于将数据转化为可以多个batch的迭代类

DataLoader(TensorDataset, batch_size, shuffle)
  • 1

模型训练

学习率

学习预热机制是指学习率的动态调度,即从0开始线性上升到一个定值(预热截断),然后线性缓慢下降到0。

由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。
来源学习率预热说明

下文代码中设置num_warmup_steps=0,实际上就是意味着没有预热的阶段。

scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps)  # 预热学习率调度器
  • 1

训练和验证模式

pytorch有两种模式,分别是训练模式和验证模式,区别在于dropout在验证模式中不用做。
在进行训练和验证的时候,需要切换模式

# 训练模式
model.train()
# 验证模式
model.eval()
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/638203
推荐阅读
相关标签
  

闽ICP备14008679号