您当前的位置:首页 > IT编程 > Keras
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers |

自学教程:tensorflow如何微调时如何只训练后两层_使用BERT和TensorFlow在10分钟内开发情感分析...

51自学网 2023-10-26 10:50:10
  Keras
这篇教程tensorflow如何微调时如何只训练后两层_使用BERT和TensorFlow在10分钟内开发情感分析...写得很实用,希望能帮到您。
tensorflow如何微调时如何只训练后两层_使用BERT和TensorFlow在10分钟内开发情感分析...

文章标签: tensorflow如何微调时如何只训练后两层

了解预训练的NLP模型BERT的基础,并使用IMDB电影评论数据集,TensorFlow和Hugging Face转换器构建情感分类器

我准备了本教程,因为从头到尾都很难找到具有实际工作的BERT代码的博客文章。 他们总是充满错误。 因此,我阅读了几篇文章,整理了他们的代码,对其进行了编辑,最后有了一个有效的BERT模型。 因此,只需运行本教程中的代码,您便可以创建一个BERT模型并对其进行微调以进行情感分析。
38d006d18d2688c80fc9843ce0f82e79.png

> Figure 1. Photo by Lukas on Unsplash

就数据预处理而言,自然语言处理(NLP)是人工智能最繁琐的领域之一。除了对文本数据集进行预处理和标记化之外,训练成功的NLP模型还需要大量时间。但是今天是您的幸运日!我们将使用预训练的NLP模型:BERT建立情感分类器。
什么是BERT?

BERT代表来自变压器Transformer的双向编码器表示,它是用于NLP任务的最先进的机器学习模型。 Jacob Devlin和他的同事于2018年在Google开发了BERT。Devlin和他的同事在英语Wikipedia(25亿个单词)和BooksCorpus(8亿个单词)上对BERT进行了培训,并在2018年完成了一些NLP任务的最佳精度。有两个预训练的一般BERT变体:基本模型是12层,隐藏层768、12头,110M参数的神经网络体系结构,而大型模型是24层,隐藏1024、16头,340M参数的神经网络体系结构 神经网络架构。 图2显示了Devlin等人创建的BERT网络的可视化。
cac7593a497ea4bedaa9c55a7e1bb6f2.png

> Figure 2. Overall pre-training and fine-tuning procedures for BERT (Figure from the BERT paper)

    因此,我不想深入研究BERT,因为我们需要一个完全不同的文章。 实际上,我已经安排了一个文章,旨在比较竞争对手的预训练NLP模型。 但是,您将需要等待一段时间。

另外,我相信我应该提到,尽管Open AI的GPT3优于BERT,但是对GPT3的访问受限会迫使我们使用BERT。但是请放心,BERT也是出色的NLP模型。这是竞争对手NLP型号之间的基本视觉网络比较:BERT,GPT和ELMo:
148deb0b3b298e7c62acd2168a380871.png

Figure 3. Differences in pre-training model architectures of BERT, GPT, and ELMo
安装Hugging Face Transformers库

我最难解决的问题之一是弄清楚在哪里可以找到可与TensorFlow一起使用的BERT模型。最后,我发现了Hugging Face的Transformers库。

Transformers提供了数千种经过预训练的模型,可以对文本执行多种任务,例如100多种语言的分类,信息提取,问题解答,摘要,翻译,文本生成等。 其目的是使尖端的NLP易于所有人使用。https://github.com/huggingface/transformers

我们可以轻松地从Transformers库中加载经过预训练的BERT。但是,请确保您已安装它,因为它尚未预装在Google Colab笔记本中。
用BERT进行情感分析

既然我们已经介绍了BERT和Hugging Face的基础知识,我们就可以深入研究我们的教程。 我们将执行以下操作来训练情绪分析模型:

· 安装Transformers库;

· 使用输入模块加载BERT分类器和分词器;

· 下载IMDB评论数据并创建处理后的数据集(这将需要执行多项操作;

· 配置加载的BERT模型并进行训练以进行微调

· 使用微调模型进行预测

让我们开始吧!

请注意,我强烈建议您使用Google Colab笔记本。如果您想了解有关如何创建Google Colab笔记本的更多信息,请查看以下文章:
安装Transformers

安装Transformers库非常容易。 只需在Google Colab单元上运行以下pip行:

pip install transformers

安装完成后,我们将加载经过预训练的BERT令牌生成器和序列分类器以及InputExample和InputFeatures。 然后,我们将使用序列分类器构建模型,并使用BERT的令牌生成器构建令牌生成器。

from transformers import BertTokenizer, TFBertForSequenceClassificationfrom transformers import InputExample, InputFeaturesmodel = TFBertForSequenceClassification.from_pretrained("bert-base-uncased")tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

我们来看看BERT模型的摘要:

model.summary()

这是结果。 我们有主要的BERT模型,一个防止过度拟合的退出层,最后是一个用于分类任务的密集层:
0e2dc7bdfd897bb920787e3ca582f012.png

> Figure 4. Summary of BERT Model for Sentiment Classification

    现在我们有了模型,让我们从IMDB评论数据集中创建输入序列:

IMDB数据集

IMDB评论数据集是由大型电影分级服务IMDB的Andrew L. Maas收集和准备的大型电影评论数据集。IMDB评论数据集用于二进制情感分类,无论评论是肯定的还是否定的。它包含25,000条用于培训的电影评论和25,000条用于测试的电影评论。所有这50,000条评论均带有标签数据,可用于监督式深度学习。此外,还有50,000个未标记的评论,在本案例研究中我们将不使用。在本案例研究中,我们将仅使用训练数据集。
初始导入依赖

我们将首先有两个依赖:TensorFlow和Pandas。

import tensorflow as tfimport pandas as pd

从斯坦福仓库获取数据

然后,我们可以使用tf.keras.utils.get_file函数从斯坦福大学的相关目录下载数据集,如下所示:

URL = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"dataset = tf.keras.utils.get_file(fname="aclImdb_v1.tar.gz",                                   origin=URL,                                  untar=True,                                  cache_dir='.',                                  cache_subdir='')

删除未标记的评论

要删除未标记的评论,我们需要执行以下操作。 以下注释说明了每个操作:

# The shutil module offers a number of high-level # operations on files and collections of files.import osimport shutil# Create main directory path ("/aclImdb")main_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')# Create sub directory path ("/aclImdb/train")train_dir = os.path.join(main_dir, 'train')# Remove unsup folder since this is a supervised learning taskremove_dir = os.path.join(train_dir, 'unsup')shutil.rmtree(remove_dir)# View the final train folderprint(os.listdir(train_dir))

训练和测试拆分

现在我们已经清理并准备好数据,接下来可以使用以下几行创建text_dataset_from_directory。 我想一次处理全部数据。 这就是为什么我选择了非常大的批次大小的原因:

# We create a training dataset and a validation # dataset from our "aclImdb/train" directory with a 80/20 split.train = tf.keras.preprocessing.text_dataset_from_directory(    'aclImdb/train', batch_size=30000, validation_split=0.2,     subset='training', seed=123)test = tf.keras.preprocessing.text_dataset_from_directory(    'aclImdb/train', batch_size=30000, validation_split=0.2,     subset='validation', seed=123)

转换为Pandas进行查看和处理

现在我们有了基本的训练和测试数据集,我想为我们的BERT模型做好准备。为了使它更易于理解,我将从TensorFlow数据集对象创建一个Pandas数据框。以下代码将我们的Train Dataset对象转换为Train Pandas数据框:

for i in train.take(1):  train_feat = i[0].numpy()  train_lab = i[1].numpy()train = pd.DataFrame([train_feat, train_lab]).Ttrain.columns = ['DATA_COLUMN', 'LABEL_COLUMN']train['DATA_COLUMN'] = train['DATA_COLUMN'].str.decode("utf-8")train.head()

这是数据集的前5行:
e4102cab881ab9f14e0db5967833d019.png

> Figure 5. First 5 Row of Our Dataset

我将使用以下代码行对测试数据集执行相同的操作:

for j in test.take(1):  test_feat = j[0].numpy()  test_lab = j[1].numpy()test = pd.DataFrame([test_feat, test_lab]).Ttest.columns = ['DATA_COLUMN', 'LABEL_COLUMN']test['DATA_COLUMN'] = test['DATA_COLUMN'].str.decode("utf-8")test.head()

创建输入序列

我们有两个Pandas Dataframe对象,等待我们将它们转换为BERT模型的合适对象。我们将利用InputExample函数来帮助我们从数据集中创建序列。InputExample函数可以如下调用:

现在,我们将创建两个主要功能:

InputExample(guid=None,             text_a = "Hello, world",             text_b = None,             label = 1)

1 — convert_data_to_examples:这将接受我们的训练和测试数据集,并将每一行转换为InputExample对象。

2 — convert_examples_to_tf_dataset:此函数将标记化InputExample对象,然后使用标记化的对象创建所需的输入格式,最后,创建可馈入模型的输入数据集。

def convert_data_to_examples(train, test, DATA_COLUMN, LABEL_COLUMN):   train_InputExamples = train.apply(lambda x: InputExample(guid=None, # Globally unique ID for bookkeeping, unused in this case                                                          text_a = x[DATA_COLUMN],                                                           text_b = None,                                                          label = x[LABEL_COLUMN]), axis = 1)  validation_InputExamples = test.apply(lambda x: InputExample(guid=None, # Globally unique ID for bookkeeping, unused in this case                                                          text_a = x[DATA_COLUMN],                                                           text_b = None,                                                          label = x[LABEL_COLUMN]), axis = 1)    return train_InputExamples, validation_InputExamples  train_InputExamples, validation_InputExamples = convert_data_to_examples(train,                                                                            test,                                                                            'DATA_COLUMN',                                                                            'LABEL_COLUMN')  def convert_examples_to_tf_dataset(examples, tokenizer, max_length=128):    features = [] # -> will hold InputFeatures to be converted later    for e in examples:        # Documentation is really strong for this method, so please take a look at it        input_dict = tokenizer.encode_plus(            e.text_a,            add_special_tokens=True,            max_length=max_length, # truncates if len(s) > max_length            return_token_type_ids=True,            return_attention_mask=True,            pad_to_max_length=True, # pads to the right by default # CHECK THIS for pad_to_max_length            truncation=True        )        input_ids, token_type_ids, attention_mask = (input_dict["input_ids"],            input_dict["token_type_ids"], input_dict['attention_mask'])        features.append(            InputFeatures(                input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids, label=e.label            )        )    def gen():        for f in features:            yield (                {                    "input_ids": f.input_ids,                    "attention_mask": f.attention_mask,                    "token_type_ids": f.token_type_ids,                },                f.label,            )    return tf.data.Dataset.from_generator(        gen,        ({"input_ids": tf.int32, "attention_mask": tf.int32, "token_type_ids": tf.int32}, tf.int64),        (            {                "input_ids": tf.TensorShape([None]),                "attention_mask": tf.TensorShape([None]),                "token_type_ids": tf.TensorShape([None]),            },            tf.TensorShape([]),        ),    )DATA_COLUMN = 'DATA_COLUMN'LABEL_COLUMN = 'LABEL_COLUMN'

我们可以使用以下几行来调用上面创建的函数:

train_InputExamples, validation_InputExamples = convert_data_to_examples(train, test, DATA_COLUMN, LABEL_COLUMN)train_data = convert_examples_to_tf_dataset(list(train_InputExamples), tokenizer)train_data = train_data.shuffle(100).batch(32).repeat(2)validation_data = convert_examples_to_tf_dataset(list(validation_InputExamples), tokenizer)validation_data = validation_data.batch(32)

我们包含处理后的输入序列的数据集已准备好馈送到模型中。
配置BERT模型和微调

我们将使用Adam作为我们的优化器,使用CategoricalCrossentropy作为我们的损失函数,并使用SparseCategoricalAccuracy作为我们的精度指标。对模型进行2个时期的微调将使我们的准确率达到95%左右,这非常好。

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=3e-5, epsilon=1e-08, clipnorm=1.0),               loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),               metrics=[tf.keras.metrics.SparseCategoricalAccuracy('accuracy')])model.fit(train_data, epochs=2, validation_data=validation_data)

训练模型可能需要一段时间,因此请确保从"笔记本设置"中启用了GPU加速。训练结束后,我们可以继续进行情绪预测。
做出预测

我创建了两个评论的列表。第一个是积极的评价,而第二个显然是消极的。

pred_sentences = ['This was an awesome movie. I watch it twice my time watching this beautiful movie if I have known it was this good',                  'One of the worst movies of all time. I cannot believe I wasted two hours of my life for this movie']

我们需要使用经过预训练的BERT令牌生成器对我们的评论添加令牌。 然后,我们将这些标记化的序列提供给我们的模型,并运行最终的softmax层以获取预测。 然后,我们可以使用argmax函数来确定我们对该评论的情绪预测是正面还是负面。 最后,我们将使用简单的for循环输出结果。 以下行完成了所有上述操作:

tf_batch = tokenizer(pred_sentences, max_length=128, padding=True, truncation=True, return_tensors='tf')tf_outputs = model(tf_batch)tf_predictions = tf.nn.softmax(tf_outputs[0], axis=-1)labels = ['Negative','Positive']label = tf.argmax(tf_predictions, axis=1)label = label.numpy()for i in range(len(pred_sentences)):  print(pred_sentences[i], ": ", labels[label[i]])

74682c45ebf914d801210232a3229f53.png

> Figure 6. Our Dummy Reviews with Their Predictions

同样,使用上面的代码,您可以预测尽可能多的评论。
恭喜啦

您已经成功构建了具有预训练的BERT模型的变压器网络,并且在IMDB评论数据集的情感分析中达到了约95%的准确性! 如果您对保存模型感到好奇,我想将您引向Keras文档。 毕竟,要有效地使用API,必须学习如何阅读和使用文档。

(本文由闻数起舞翻译自Chris Lovejoy的文章《Sentiment Analysis in 10 Minutes with BERT and TensorFlow》,转载请注明出处,原文链接:https://towardsdatascience.com/sentiment-analysis-in-10-minutes-with-bert-and-hugging-face-294e8a04b671)
————————————————
版权声明:本文为CSDN博主「weixin_39576149」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39576149/article/details/111361807
返回列表
选择国内的镜像源网址来提升安装第三方库的速度:源+使用方法
51自学网自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1