简介:本文将介绍 KerasNLP 的安装及使用,以及如何使用它在情感分析任务中微调 BERT 的预训练模型。
1. KerasNLP库
KerasNLP 是一个自然语言处理库,兼容 TensorFlow、JAX 和 PyTorch 等多种深度学习框架。基于 Keras 3 构建,这些模型、层、指标和分词器可以在任何框架中训练和序列化,并且可重复应用于其他框架中,无需其他复杂开发步骤。
安装代码
pip install --upgrade keras-nlp
pip install --upgrade keras
2. BERT模型介绍
BERT,全称为Bidirectional Encoder Representations from Transformers,是由谷歌AI团队提出的一种预训练语言模型。
它基于Transformer架构,通过双向的编码器对文本进行建模,即同时考虑上下文信息,从而捕捉词汇间的深层语义关系。
BERT在预训练阶段使用无监督的Masked Language Model(掩码语言模型)和Next Sentence Prediction(下一句预测)任务进行训练,随后可以通过微调在各种自然语言处理任务中取得显著的效果。BERT的出现极大地提升了NLP领域的表现,广泛应用于问答系统、文本分类、命名实体识别等任务。
更多的NLP模型参考:KerasNLP Models
3. 代码示例
项目介绍:
项目的主要目标是通过微调预训练的BERT模型,准确地将电影评论分类为正面或负面。
数据集介绍:
本文使用的是tensorflow内置的IMDB影评数据集。该数据集包含来自互联网电影数据库(IMDB)的 50,000 条影评,用于二分类任务(正面和负面)。IMDB数据集是情感分析的经典数据集,广泛用于评估和比较不同模型的性能。
# 配置环境
import os
os.environ["KERAS_BACKEND"] = "tensorflow" # Or "jax" or "torch"!# 导入库
import keras_nlp
import tensorflow_datasets as tfds# 导入数据
imdb_train, imdb_test = tfds.load("imdb_reviews",split=["train[:10%]", "test[:10%]"], #原代码为split=["train", "test"],这里只取10%的样本量以减少训练耗时as_supervised=True,batch_size=16,
)# 加载BERT模型
classifier = keras_nlp.models.BertClassifier.from_preset("bert_base_en_uncased", num_classes=2, # 结果只需要两种分类:正面OR负面
)# 模型训练
classifier.fit(imdb_train, validation_data=imdb_test)# 预测结果
classifier.predict(["What an amazing movie!", "A total waste of my time."])
结果输出:
![[超快速入门 KerasNLP & KerasCV-20240625170242587.webp|524]]
解释: 每行对应一个输入样本(电影评论),每个样本的预测分数有两个值。这些分数是未经过处理的原始logits,分别对应两个分类(正面和负面)。
-
第一行[-2.00009, 1.8325567]:对应(What an amazing movie!)。 由于正面评论(1.83)的分数高于负面评论(-2.00),模型预测为正面评论。
-
第二行[1.9168645, -1.5912567]:对应样本二(A total waste of my time.)。由于负面评论(1.91)的分数高于正面评论(-1.59),模型预测为负面评论。
在此例中,使用的是 KerasNLP 的
BertClassifier
,默认情况下,它会按照标签顺序输出预测分数。假设数据集中正面评论标签为1,负面评论标签为0,那么模型输出的第一个分数对应标签0(负面),第二个分数对应标签1(正面)。
查看数据集的类别标签及顺序:
info = tfds.builder('imdb_reviews').info
print(info.features['label'].names)
输出:
结果转换:
我们可以使用Softmax函数将原始分数logits转换成对应的类别标签:
import numpy as np
import tensorflow as tflogits = np.array([[-2.00009, 1.8325567], [1.9168645, -1.5912567]])# 1. 定义 softmax 函数:
def softmax(x):return tf.nn.softmax(x)# 2. 计算 softmax 概率:
probabilities = softmax(logits)# 3. 获取预测类别索引
predicted_classes = np.argmax(probabilities, axis=1)# 定义类别标签映射
class_labels = ['neg', 'pos']# 将预测类别索引转换为对应的标签
predicted_labels = [class_labels[idx] for idx in predicted_classes]# 打印每条评论的预测结果
test_reviews = ["What an amazing movie!", "A total waste of my time."]
for review, label in zip(test_reviews, predicted_labels):print(f"Review: \"{review}\" -> Sentiment: {label}")# 输出 logits、softmax 概率和预测类别(可选)
print("Logits:\n", logits)
print("Probabilities:\n", probabilities)
print("Predicted Classes:\n", predicted_classes)
参考链接:KerasNLP