如何在aclImdb数据集上使用LSTM和预训练的静态词向量



我正在尝试使用LSTM和预训练BERT嵌入的情感分类,以及后来使用Transformer的语言翻译首先我下载了

!pip install ktrain
!pip install tensorflow_text

我导入了必要的lib

import pathlib
import random
import numpy as np
from typing import Tuple, List
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from sklearn.model_selection import train_test_split
# tensoflow imports
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import (
TextVectorization, LSTM, Dense, Embedding, Dropout,
Layer, Input, MultiHeadAttention, LayerNormalization)
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.initializers import Constant
from tensorflow.keras import backend as K
import tensorflow_text as tf_text 
import ktrain
from ktrain import text

我从斯坦福大学下载并提取了大型电影数据集

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

1-我尝试通过使用ktrain的texts_from_folder函数创建训练集和测试集来使用LSTM。文本模块

%reload_ext autoreload
%autoreload 2
%matplotlib inline
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID";
os.environ["CUDA_VISIBLE_DEVICES"]="0";
DATADIR ='/content/aclImdb'
trn, val, preproc = text.texts_from_folder(DATADIR,max_features=20000, maxlen=400, ngram_range=1,                                               preprocess_mode='standard', train_test_names=['train', 'test'],classes=['pos', 'neg'])

和我试图建立LSTM模型她

K.clear_session()    
def build_LSTM_model(
embedding_size: int,
total_words: int,
lstm_hidden_size: int,
dropout_rate: float) -> Sequential:
model.add(Embedding(input_dim = total_words,output_dim=embedding_size,input_length=total_words))
model.add(LSTM(lstm_hidden_size,return_sequences=True,name="lstm_layer"))
model.add(GlobalMaxPool1D())
#     model.add(Dense(total_words, activation='softmax'))
model.add(Dropout(dropout_rate))
model.add(Dense(MAX_SEQUENCE_LEN, activation="relu"))
#     adam = Adam(lr=0.01)
model.compile(loss='CategoricalCrossentropy', optimizer=Adam(lr=0.01), metrics=['CategoricalAccuracy'])
model.summary()
model = Sequential()

,该模型应包括以下要求:一开始有一个嵌入层。(注意正确的参数化!)至少有一个LSTM层。至少有一个Dropout层用于正则化。最后一个映射到输出的致密层。编译模型,带有categorical_crossentropy loss和Adam优化器。或者可能想要添加其他类型的指标,例如CategoricalAccuracy在这里是有意义的。

然后我想使用ktrain库的get_learner方法来创建先前模型的易于训练的版本。并使用测试集作为val_data,去看演出。(不包括适当的训练-验证-测试分割,但如果需要,可以扩展。)我正在使用学习者的lr_findlr_plot确定模型最有效学习率的方法。max_epochslr_find参数为了限制这需要的时间。几个时代!根据图确定最佳学习率。并在最快收敛和稳定性之间找到平衡

learner: ktrain.Learner
model = text.text_classifier('bert', trn , preproc=preproc)
learner.lr_find()
learner.lr_plot()
learner.fit_onecycle(1e-4, 1)

我遇到了以下错误ValueError(最近一次调用)在()6 # workers=8, use_multiprocessing=False, batch_size=64)7——比;8模型=文本。Text_classifier ('bert', TRN, preproc=preproc)

10 # learner.lr_find()
1 frames
/usr/local/lib/python3.7/dist-packages/ktrain/text/models.py in _text_model(name, train_data, preproc, multilabel, classification, metrics, verbose)
109         raise ValueError(
110             "if '%s' is selected model, then preprocess_mode='%s' should be used and vice versa"
--> 111             % (BERT, BERT)
112         )    113     is_huggingface = U.is_huggingface(data=train_data)
ValueError: if 'bert' is selected model, then preprocess_mode='bert' should be used and vice versa
下一步是用预训练的制作LSTM静态词向量

如果您对作为特征提供给LSTM的预训练词向量使用BERT,那么您不需要构建单独的BERT分类模型。您可以使用TransformerEmbedding为您的数据集生成词向量(或使用句子转换器):

In [1]: from ktrain.text import TransformerEmbedding
In [2]: te = TransformerEmbedding('bert-base-cased')
In [3]: te.embed('George Washington went to Washington .').shape
Out[3]: (1, 6, 768)

这是ktrain中包含的NER模型做底层的。

此外,BERT模型的输入特征格式与LSTM的输入特征完全不同。如错误信息所示,为了预处理BERT分类模型的文本,您需要将preprocess_mode='bert'提供给texts_from_folder

最新更新