Я пытаюсь использовать BERT для анализа настроений, но подозреваю, что делаю что-то не так. В моем коде я выполняю тонкую настройку, используя bert-for-tf2
, но после 1 эпохи я получаю точность 42%, когда простая модель GRU достигает точности около 73%. Что я должен делать по-другому, чтобы эффективно использовать BERT. Я подозреваю, что я перемещаю слои Bert из первой партии, что может быть проблемой, так как плотный слой инициализируется случайным образом. Любой совет будет оценен, спасибо!
import bert-for-tf2 #gets imported as bert but relabeled for clarity
model_name = "uncased_L-12_H-768_A-12"
model_dir = bert.fetch_google_bert_model(model_name, ".models")
model_ckpt = os.path.join(model_dir, "bert_model.ckpt")
bert_params = bert.params_from_pretrained_ckpt(model_dir)
l_bert = bert.BertModelLayer.from_params(bert_params, name="bert")
max_seq_len = 100
l_input_ids = tensorflow.keras.layers.Input(shape=(max_seq_len,), dtype='int32')
bertLayer = l_bert(l_input_ids)
flat = Flatten()(bertLayer)
output = Dense(1,activation = 'sigmoid')(flat)
model = tensorflow.keras.Model(inputs=l_input_ids, outputs=output)
model.build(input_shape=(None, max_seq_len))
bert.load_bert_weights(l_bert, model_ckpt)
with open('../preprocessing_scripts/new_train_data.txt', 'r') as f:
tweets = f.readlines()
with open('../preprocessing_scripts/targets.csv', 'r') as f:
targets = f.readlines()
max_words = 14000
tokenizer = Tokenizer(num_words=max_words)
trainX = tweets[:6000]
trainY = targets[:6000]
testX = tweets[6000:]
testY = tweets[6000:]
maxlen = 100
tokenizer.fit_on_texts(trainX)
tokenized_version = tokenizer.texts_to_sequences(trainX)
tokenized_version = pad_sequences(tokenized_version, maxlen=maxlen)trainY = np.array(trainY,dtype = 'int32')
model.compile(loss="binary_crossentropy",
optimizer="adam",
metrics=['accuracy'])
history = model.fit(x=tokenized_version, y=trainY, batch_size = 32, epochs=1, validation_split = 0.2)