快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

这篇具有很好参考价值的文章主要介绍了快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

本项目采用HuggingFace提供的工具实现BERT模型案例,并在BERT后接CNN、LSTM等
HuggingFace官网
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

一、实现BERT(后接线性层)

1.引用案例源码:
from transformers import BertTokenizer, BertModel
import torch
model_name = 'bert-base-uncased'

tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

inputs = tokenizer("Hello, my dog is cute", return_tensors="pt" , padding='max_length',max_length=10)
outputs = model(**inputs)
# print(inputs) # 字典类型的input_ids必选字段  101CLS  102SEP
last_hidden_states = outputs.last_hidden_state  # last_hidden_state 最后一层的输出  pooler_output / hidden_states 

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
程序会自行下载模型和配置文件,也可自行在官网上手动下载
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
模型返回的参数
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

2. 自定义类调用数据集
class MyDataSet(Data.Dataset) :
    def __init__(self , data ,label):
        self.data = data # ['今天天气很好', 'xxxx' , ……]
        self.label = label # [1 , 2 , 0]
        self.tokenizer = BertTokenizer.from_pretrained(model_name)
    def __getitem__(self , idx):
        text = self.data[idx] # str
        label = self.label[idx]
        inputs = self.tokenizer(text , return_tensors="pt" , padding='max_length',max_length=10 , truncation = True)  # truncation = True 是否进行截断操作
        input_ids = inputs.input_ids.squeeze(0) # squeeze(0) 对张量进行降维操作 为啥降维:输入的data是一句话(一维)但生成的input_ids默认是二维,因此需要降维
        token_type_ids = inputs.token_type_ids.squeeze(0)
        attention_mask = inputs.attention_mask.squeeze(0)
        return input_ids , token_type_ids , attention_mask,label
    def __len__(self):
        return len(self.data)

squeeze(0)的作用: 举个栗子

input_ids: tensor([[ 101, 7592, 1010, 2026, 3899, 2003, 10140, 102, 0, 0]])
b = input_ids.squeeze(0)
b: tensor([ 101, 7592, 1010, 2026, 3899, 2003, 10140, 102, 0, 0])
当张量是一个1 * n 维度的张量时,input_ids的维度是 1 * 10,调用squeeze(0) 将张量降成1维。
若不是1 * n的这种2维张量,如本就是1维的,或者m * n(其中m和n都是大于1的),调用这个函数没有效果。

squeeze(1)和squeeze(-1)作用相同 ,与squeeze(0)类似
将一个n*1维度的张量降成1维

3. 将数据集传入模型
data , label = [] , []
with open('./dataset/data.txt') as f:
    for line in f.readlines():
        a, b = line.strip().split(' ')
        data.append(a)
        label.append(int(b))
dataset = MyDataSet(data,label)
dataloader = Data.DataLoader(dataset , batch_size = 2,shuffle =True)
4.自定义模型
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel,self).__init__()
        self.bert = BertModel.from_pretrained(model_name)
        self.liner = nn.Linear(768, 3)  # "hidden_size": 768
    
    def forward(self , input_ids , token_type_ids , attention_mask) :
        output = self.bert(input_ids , token_type_ids ,attention_mask).pooler_output # [batch_size , hidden_size]
        # print(output.shape)
        output = self.linnear(output)
        return output
5.配置运行环境
device = torch.device('cuda')
model = MyModel().to(device)
loss_fun = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters() , lr = 1e-5)
6.训练模型,计算损失
for epoch in range(10):
    for input_ids,token_type_ids,attention_mask ,label in dataloader:
        input_ids,token_type_ids,attention_mask ,label = input_ids.to(device),token_type_ids.to(device),attention_mask.to(device) ,label.to(device)
        pred = model(input_ids,token_type_ids,attention_mask)
        
        loss = loss_fn(pred , label)
        print(loss.item())
        
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
易出现显存不够的错误,可以在服务器控制台中输入nvidia-smi //查看所有进程信息
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
选择需要杀死的进程taskkill /PID PTD号 /F //使用taskkill 进程id,杀死进程
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

二、BERT+CNN

添加卷积层,查看需要的参数
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
输入层和输出层之间的参数关系为:Wout = (Win + 2p - w)/ s +1 ; Hout = (Hin + 2p - w)/ s +1
其中Win = maxlen,Hin = hidden_size,卷积核大小为 w * h ,p表示padding(默认为0),s表示卷积步长(默认为1)
因此输出为 (10 + 2 * 0 - 2)/ 1 + 1 = 9 ,(768 + 2 * 0 - 768)/ 1 + 1 = 1

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.bert = BertModel.from_pretrained(model_name)

        '''
        BERT后接CNN
        '''
        self.conv = nn.Conv2d(1 ,3 ,kernel_size=(2,768)) # in_channels 输入的通道数 out_channels 经过卷积之后的通道数 kernel_size 卷积核大小
        self.linear = nn.Linear(27, 3)  # "hidden_size": 768

    def forward(self, input_ids, token_type_ids, attention_mask):
        '''

        x : [batch , channel , width , height]

        '''
        batch = input_ids.size(0)
        output = self.bert(input_ids, token_type_ids, attention_mask).last_hidden_state  # [batch_size , seq , hidden_size]
        output = output.unsqueeze(1) # [batch , 1, seq , hidden_size] 三维扩展成四维
        # print(output.shape)
        output = self.conv(output) # [batch , 3, 9 ,1]
        print(output.shape)
        # 为了进行分类,希望将四维转换成二维 # [batch , 3]
        output = output.view(batch , -1) # [batch , 3*9*1]

        output = self.linear(output)
        return output

输出结果

torch.Size([2, 3, 9, 1])
1.0467640161514282
torch.Size([1, 3, 9, 1])
1.6651103496551514
torch.Size([2, 3, 9, 1])
1.1516715288162231
torch.Size([1, 3, 9, 1])
1.0645687580108643
torch.Size([2, 3, 9, 1])
1.0910512208938599
torch.Size([1, 3, 9, 1])
0.9897172451019287
torch.Size([2, 3, 9, 1])
1.0313527584075928
torch.Size([1, 3, 9, 1])
1.0067516565322876
torch.Size([2, 3, 9, 1])
0.9847115278244019
torch.Size([1, 3, 9, 1])
1.01240873336792
torch.Size([2, 3, 9, 1])
0.9597381353378296
torch.Size([1, 3, 9, 1])
0.9435619115829468
torch.Size([2, 3, 9, 1])
0.9591015577316284
torch.Size([1, 3, 9, 1])
0.8384571075439453
torch.Size([2, 3, 9, 1])
0.9722234010696411
torch.Size([1, 3, 9, 1])
0.7264331579208374
torch.Size([2, 3, 9, 1])
0.9841375350952148
torch.Size([1, 3, 9, 1])
0.6240622997283936
torch.Size([2, 3, 9, 1])
0.7659112811088562
torch.Size([1, 3, 9, 1])
1.0371975898742676

三、BERT+LSTM

添加LSTM,查看需要哪些参数
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM
快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.bert = BertModel.from_pretrained(model_name)
        '''
        BERT后接LSTM
        '''
        self.lstm = nn.LSTM(input_size=768, hidden_size= 512 ,num_layers= 1 , batch_first= True , bidirectional=True) # batch_first = True 表示输入输出顺序(batch,seq,feature) LSTM默认(seq,batch,feature)
        self.linear = nn.Linear(1024, 3)  # "hidden_size": 768

    def forward(self, input_ids, token_type_ids, attention_mask):
        '''
        x : [batch , seq]
        '''
        batch = input_ids.size(0)
        output = self.bert(input_ids, token_type_ids, attention_mask).last_hidden_state  # [batch_size , seq , hidden_size]
        output , _ = self.lstm(output)
        print(output.shape) # [2 , seq ,2*hidden_size]

        # 使用LSTM最后一层的输出做分类
        output = output[: ,-1,:] # [batch , 1024]
        print('最后一层' ,output.shape)
        output = self.linear(output)
        return output

输出结果

{‘input_ids’: tensor([[ 101, 7592, 1010, 2026, 3899, 2003,
10140, 102, 0, 0]]), ‘token_type_ids’: tensor([[0, 0, 0, 0,
0, 0, 0, 0, 0, 0]]), ‘attention_mask’: tensor([[1, 1, 1, 1, 1, 1, 1,
1, 0, 0]])} [‘今天天气很好’, ‘今天天气很不好’, ‘明天天气非常好’] [1, 0, 2]

torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.0788244009017944 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.3834939002990723 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.155088186264038 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.0809415578842163 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.061639666557312 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.1302376985549927 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.0572789907455444 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.086378812789917 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.0700803995132446 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.0184061527252197 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
0.9948051571846008 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.203598976135254 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.1068116426467896 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
0.9117098450660706 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
0.9891176223754883 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.1974778175354004 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
1.0810655355453491 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
0.8861477375030518 torch.Size([2, 10, 1024]) 最后一层 torch.Size([2, 1024])
0.9180283546447754 torch.Size([1, 10, 1024]) 最后一层 torch.Size([1, 1024])
1.2292695045471191

要实现BERT后接各种模型,最重要的是需要知道模型经过每一层后的维度是多少,最粗暴的方式可以通过print输出维度。文章来源地址https://www.toymoban.com/news/detail-454831.html

到了这里,关于快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Pytorch框架的CNN-LSTM模型在CWRU轴承故障诊断的应用

    目录 1. 简介 2. 方法 2.1数据集 2.2模型架构 1. 简介 CWRU轴承故障诊断是工业领域一个重要的问题,及早发现轴承故障可以有效地减少设备停机时间和维修成本,提高生产效率和设备可靠性。传统的基于信号处理和特征提取的方法通常需要手工设计特征,这在某些情况下可能无法

    2024年04月15日
    浏览(67)
  • 人工智能(pytorch)搭建模型16-基于LSTM+CNN模型的高血压预测的应用

    大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型16-基于LSTM+CNN模型的高血压预测的应用,LSTM+CNN模型搭建与训练,本项目将利用pytorch搭建LSTM+CNN模型,涉及项目:高血压预测,高血压是一种常见的性疾病,早期预测和干预对于防止其发展至严重疾病至关重要

    2024年02月12日
    浏览(74)
  • 最强Python开源库PyTorch入门实战(案例实战)+快速上手TorchServe

    作者:禅与计算机程序设计艺术 在过去几年里,深度学习领域涌现了一大批高水平的模型,这些模型基于大量的数据和GPU计算能力实现了炫酷的效果。这其中最具代表性的是卷积神经网络(Convolutional Neural Networks, CNN),其网络结构可以学习到图像、视频、文本等多种模态特

    2024年02月07日
    浏览(42)
  • 分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测

    分类效果 基本描述 1.SCNGO-CNN-LSTM-Attention数据分类预测程序,改进算法,融合正余弦和折射反向学习的北方苍鹰优化算法; 2.程序平台:无Attention适用于MATLAB 2020版及以上版本;融合Attention要求Matlab2023版以上; 3.基于融合正余弦和折射反向学习的北方苍鹰优化算法(SCNGO)、卷

    2024年02月11日
    浏览(41)
  • 回归预测 | MATLAB实现CNN-LSTM-Attention多输入单输出回归预测

    预测效果 基本介绍 MATLAB实现CNN-LSTM-Attention多输入单输出回归预测,CNN-LSTM结合注意力机制多输入单输出回归预测。 模型描述 Matlab实现CNN-LSTM-Attention多变量回归预测 1.data为数据集,格式为excel,7个输入特征,1个输出特征; 2.MainCNN_LSTM_Attention.m为主程序文件,运行即可; 3.命

    2024年02月06日
    浏览(56)
  • 基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)

    💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳ 座右铭: 行百里者,半于九十。 📋 📋 📋 本文目录如下: 🎁 🎁 🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 参

    2024年02月02日
    浏览(51)
  • 时间序列预测 — CNN-LSTM-Attention实现多变量负荷预测(Tensorflow):多变量滚动

       专栏链接: https://blog.csdn.net/qq_41921826/category_12495091.html 专栏内容 ​ 所有文章提供源代码、数据集、效果可视化 ​ 文章多次上领域内容榜、每日必看榜单、全站综合热榜 ​ ​ ​

    2024年01月23日
    浏览(40)
  • 【人工智能】Transformers 快速上手: 为 Jax、PyTorch 和 TensorFlow 打造的先进的自然语言处理

    为 Jax、PyTorch 和 TensorFlow 打造的先进的自然语言处理 🤗 Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成。它的宗旨是让最先进的 NLP 技术人人易用。 🤗 Transformers 提供了便于快速下载和使用的API,让你可以把

    2024年02月08日
    浏览(69)
  • LSTM实现时间序列预测(PyTorch版)

    💥项目专栏:【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)

    2023年04月24日
    浏览(56)
  • 【CEEMDAN-CNN-LSTM】完备集合经验模态分解-卷积神经长短时记忆神经网络研究(Python代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 1.1 完备集合经验模态分解原理 1.2 鲸鱼优化 1.3 LSTM 📚

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包