Pytorch使用BERT预训练模型微调文本分类,IMDb电影评论数据集

最近终于用Pytorch把BERT的fine tune本文分类跑通了,算是对于pytorch和bert的理解都深了一点。现在把我训练的整个流程记录分享一下。Google Colab因为BERT的模型比较大,参数也非常多。所以自己电脑用CPU是基本跑不出来的。在Google Colab上用免费GPU我感觉非常方便。对于新手而言,其交互式界面也很友好。还有一个好处是Google Colab自带...
摘要由CSDN通过智能技术生成

最近终于用Pytorch把BERT的fine tune本文分类跑通了,算是对于pytorch和bert的理解都深了一点。

现在把我训练的整个流程记录分享一下。

Google Colab

因为BERT的模型比较大,参数也非常多。所以自己电脑用CPU是基本跑不出来的。在Google Colab上用免费GPU我感觉非常方便。对于新手而言,其交互式界面也很友好。

还有一个好处是Google Colab自带了很多深度学习相关的库,例如tensorflow,pytorch等等。就不需要自己再安装了。

此外因为Colab的服务器在国外,所以下载国外的数据集等东西都非常快!这一点让我十分惊喜。

创建好Notebook后注意要在设置中打开GPU

打开后device应该是‘cuda’

import torch
device='cuda' if torch.cuda.is_available() else 'cpu'

可以通过下面的指令查看GPU的信息如型号和显存等。

!nvidia-smi

Google Colab有一个不好的地方是上传的文件在一段时间不运行后会被清掉。这是因为它的磁盘和内存管理都是动态的。不过因为是免费的,这个缺点我倒是很能接受。

安装所需要的库

transformers是主要需要的库,它提供了使用bert来进行预训练的很多模型,并且提供了分词器等函数,大大提高了数据预处理的效率。

!pip install transormers

下载数据集并进行预处理

要用到的数据集是IMDb电影评论数据集,这是一个sentiment analysis任务的数据集。IMDB数据集包含来自互联网的50000条严重两极分化的评论,该数据被分为用于训练的25000条评论和用于测试的25000条评论,训练集和测试集都包含50%的正面评价和50%的负面评价。所以这是一个二分类任务。

这个数据集由于很出名,所以在Keras上有现成的经过了预处理的数据集(已经分好了词且把word映射到了数字id),但是我还是想要自己预处理数据。所以就直接下载原数据集并将其解压。

!wget https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
!tar -zxvf aclImdb_v1.tar.gz

对数据集进行预处理

这个数据集里面的每一个训练样本都是一个txt文件,并且因为是直接从html文件中拷贝过来,还有一些如<br/><br/>的html标签字符。除掉这些标签后要把它整合成一个大的字符串列表。代码如下

import re
import os 
def rm_tags(text):
    re_tags = re.compile(r'<[^>]+>')
    return re_tags.sub(' ',text)

def read_files(filetype):
    path = "aclImdb/"
    file_list=[]
    
    positive_path = path + filetype + "/pos/"
    for f in os.listdir(positive_path):
        file_list += [positive_path + f]
        
    negative_path = path + filetype + "/neg/"
    for f in os.listdir(negative_path):
        file_list += [negative_path + f]   
        
    print("read",filetype,"files:",len(file_list))
    
    all_labels = ([1]*12500+[0]*12500)
    
    all_texts = []
    for fi in file_list:
        with open(fi,encoding = 'utf8') as file_input:
            all_texts += [rm_tags(" ".join(file_input.readlines()))]
            
    return all_labels,all_texts

y_train,train_text = read_files("train")
y_test,test_text = read_files("test")

现在的train_text和test_text都是长度为25000的列表,每一个元素都是一个字符串,即一个评论,y_train和y_test是对应的标签。

分词和编码

分词即是把一个句子分成一个一个的单词(一个一个的token,包括标点)。因为神经网络接受的不可能是单词,肯定是一些数字。所以要把这些单词编码成数字(tokens to ids)。

from transformers import BertTokenizer

# Load the BERT tokenizer.
print('Loading BERT tokenizer...')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', do_lower_case=True)

sentences=train_text
labels=y_train

test_sentences=test_text
test_labels=y_test

可以打印一个示例看看效果

# Print the original sentence.
print(' Original: ', sentences[0])

# Print the sentence split into tokens.
print('Tokenized: ', tokenizer.tokenize(sentences[0]))

# Print the sentence mapped to token ids.
print('Token IDs: ', token
  • 13
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值