文章目录
- [1. 代码展示](#1. 代码展示)
- [2. 整体流程介绍](#2. 整体流程介绍)
- [3. 代码解读](#3. 代码解读)
- [4. 报错解决](#4. 报错解决)
-
- [4.1 解决思路](#4.1 解决思路)
- [4.2 解决方法](#4.2 解决方法)
- [5. Bert介绍](#5. Bert介绍)
-
- [5.1 什么是Bert](#5.1 什么是Bert)
1. 代码展示
python
from tqdm import tqdm # 可以在循环中添加进度条
x = [1, 2, 3] # list
print(x[:10] + [0] * -7)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
labels = []
train_list = []
with open("../data/ChnSentiCorp.txt", mode='r', encoding='utf-8') as file:
for line in tqdm(file.readlines()):
line = line.strip().split(',')
labels.append(int(line[0]))
text = tokenizer.encode(line[1])
token = text[:80] + [0] * (80 - len(text))
train_list.append(token)
python
import numpy as np
labels = np.array(labels)
train_list = np.array(train_list)
# 已经把数据转化成了词向量 (Bert不需要词嵌入) RNN --> LSTM
from transformers import TFBertForSequenceClassification
model = TFBertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)
model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
result = model.fit(x=train_list, y=labels, batch_size=128, epochs=10)
print(result.history)
2. 整体流程介绍
首先,概述一下代码的主要目的和流程。
主要目的 :
此代码的主要目的是使用BERT模型进行序列分类。具体来说,它似乎是在处理某种情感分析任务,因为代码中读取了标签和文本,并试图用BERT模型来进行分类(假设为正面或负面情感,因为num_labels=2
)。
整体流程:
-
导入所需库:
tqdm
:用于显示循环的进度条。transformers
:提供预训练的模型和相关的工具。
-
数据预处理:
- 定义了两个空列表
labels
和train_list
,用于存储从文件中读取的标签和文本数据。 - 打开一个名为
ChnSentiCorp.txt
的文件,并从中读取数据。假设每行的格式是"标签,文本"。 - 使用BERT的tokenizer将每行文本转化为token。然后,确保每行文本的token长度为80,如果长度不足80,则用0填充。
- 定义了两个空列表
-
转换数据格式:
- 将labels和train_list列表转换为numpy数组。
-
加载和初始化BERT模型:
- 使用
TFBertForSequenceClassification.from_pretrained
方法加载bert-base-chinese
预训练模型,并指定类别数量为2。 - 编译模型,设置损失函数和评估指标,并显示模型摘要。
- 使用
-
模型训练:
- 使用处理后的
train_list
作为输入和labels
作为目标进行模型训练。 - 显示训练历史。
- 使用处理后的
综上,代码的整体流程是:导入库→数据预处理→数据格式转换→加载和初始化BERT模型→模型训练。
3. 代码解读
像debug一样逐步解释您提供的代码。
python
from tqdm import tqdm # 可以在循环中添加进度条
这一行导入了tqdm
库,它是一个在循环中显示进度条的库。
python
x = [1, 2, 3] # list
print(x[:10] + [0] * -7)
这里首先定义了一个列表x
。接下来,x[:10]
表示获取列表x的前10个元素,但因为x只有3个元素,所以它其实会返回整个x。[0] * -7
将产生一个空列表,因为乘以一个负数的结果是空。所以print
语句的输出将是[1, 2, 3]
。
python
from transformers import AutoTokenizer
这里从transformers
库中导入了AutoTokenizer
。transformers
库提供了很多预训练模型及其相关的工具,AutoTokenizer
是其中的一个。
python
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
使用bert-base-chinese
这个预训练模型的tokenizer。这个tokenizer是针对中文BERT模型的。
python
labels = []
train_list = []
with open("../data/ChnSentiCorp.txt", mode='r', encoding='utf-8') as file:
for line in tqdm(file.readlines()):
line = line.strip().split(',')
labels.append(int(line[0]))
text = tokenizer.encode(line[1])
token = text[:80] + [0] * (80 - len(text))
train_list.append(token)
这段代码读取文件ChnSentiCorp.txt
并从中获取标签和文本数据。每一行都是由一个标签和文本组成的,两者之间用逗号分隔。文本数据被tokenized并被截断或填充至长度80。
python
import numpy as np
labels = np.array(labels)
train_list = np.array(train_list)
这里首先导入了numpy库,并将labels和train_list转换为numpy数组。
python
from transformers import TFBertForSequenceClassification
从transformers
库中导入了用于序列分类的TFBert模型。
python
model = TFBertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)
初始化一个预训练的BERT模型用于序列分类。这里指定了类别数量为2。
python
model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
模型被编译,使用了sparse_categorical_crossentropy
作为损失函数,并设置了accuracy
作为评估指标。model.summary()
会显示模型的结构和参数信息。
python
result = model.fit(x=train_list, y=labels, batch_size=128, epochs=10)
print(result.history)
模型训练过程。使用train_list作为输入数据,labels作为标签。批大小设置为128,总共训练10轮。训练完毕后,会打印训练历史数据。
4. 报错解决
执行下面的代码的时候报错:
python
from transformers import TFBertForSequenceClassification
model = TFBertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=2)
报错信息如下:
python
requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /bert-base-chinese/resolve/main/pytorch_model.bin (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x000001AAEB8F3700>, 'Connection to huggingface.co timed out. (connect timeout=10)'))
4.1 解决思路
您的报错信息提示了连接超时问题。当您尝试从huggingface的服务器加载预训练的模型时,出现了这个问题。
以下是可能的原因及其解决方案:
-
网络问题:您的机器可能无法访问huggingface的服务器。这可能是由于网络速度慢、防火墙设置、网络断开或其他网络相关问题。
解决方案:
- 请确保您的网络连接正常。
- 试试是否可以手动访问
huggingface.co
网站。 - 检查您的防火墙或代理设置,确保它们没有阻止您访问huggingface的服务器。
-
Huggingface服务器问题:有时,由于服务器的高负载或其他问题,huggingface的服务器可能会暂时不可用。
解决方案:
- 稍后再试。
-
使用代理:如果您处于一个需要代理访问外部网站的网络环境中(如在某些公司或国家),那么可能需要配置代理。
解决方案:
- 设置Python的代理,或使用VPN。
-
下载模型并本地加载:如果以上方法都不起作用,您可以手动下载模型,然后从本地加载。
解决方案:
- 手动从huggingface的模型库中下载
bert-base-chinese
模型。 - 将下载的模型存放在本地目录中,然后使用
from_pretrained
方法加载该目录。
- 手动从huggingface的模型库中下载
例如:
python
model = TFBertForSequenceClassification.from_pretrained("/path_to_directory/bert-base-chinese", num_labels=2)
其中/path_to_directory/bert-base-chinese
是您存放模型文件的本地目录。
4.2 解决方法
科学上网
5. Bert介绍
5.1 什么是Bert
当然可以!
BERT简介:
BERT(Bidirectional Encoder Representations from Transformers)是由Google在2018年提出的一个预训练的深度学习模型,用于自然语言处理(NLP)任务。BERT的突出特点是其双向性,即它可以同时考虑文本中的前后上下文,从而捕捉更丰富的语义信息。
BERT的核心思想:
- 双向性:传统的语言模型,如LSTM和GRU,是单向的,只能考虑前面的上下文或后面的上下文。BERT通过同时考虑前后上下文来捕捉更复杂的语义信息。
- 预训练和微调:BERT首先在大量无标签文本上进行预训练,然后可以用少量的标注数据进行微调,以适应特定的NLP任务。
- Transformer架构:BERT基于Transformer架构,它是一个高效的自注意力机制,可以捕捉文本中长距离的依赖关系。
BERT的预训练策略:
- Masked Language Model (MLM):随机遮蔽句子中的一些单词,并让模型预测这些遮蔽单词。这样,模型必须学习理解文本的上下文信息,以预测遮蔽的部分。
- Next Sentence Prediction (NSP):模型接收两个句子作为输入,并预测第二个句子是否是第一个句子的下一个句子。
BERT的应用:
经过预训练后的BERT模型可以被微调并应用于各种NLP任务,如文本分类、命名实体识别、问答系统等。由于BERT能够捕捉丰富的上下文信息,它在许多NLP任务中都取得了当时的最先进性能。
为什么BERT如此受欢迎?
- 强大的性能:BERT在多种NLP任务上都达到了当时的最先进的性能。
- 通用性:同一个预训练的BERT模型可以被微调并应用于多种NLP任务,无需从头开始训练。
- 可用性:由于Google和其他组织发布了预训练的BERT模型和相关工具,开发者可以轻松地使用BERT进行自己的NLP项目。
总结:
BERT是当前NLP领域的一个里程碑,它改变了我们如何处理和理解文本的方式。对于初学者,理解BERT及其工作原理是深入研究现代NLP的关键。希望这个简介能帮助您对BERT有一个初步的了解!