python - 使用 BERT 编码器的二元分类模型准确率达 50%
问题描述
我正在尝试为 Yelp 二进制分类任务训练一个简单的模型。
加载 BERT 编码器:
gs_folder_bert = "gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-12_H-768_A-12"
bert_config_file = os.path.join(gs_folder_bert, "bert_config.json")
config_dict = json.loads(tf.io.gfile.GFile(bert_config_file).read())
bert_config = bert.configs.BertConfig.from_dict(config_dict)
_, bert_encoder = bert.bert_models.classifier_model(
bert_config, num_labels=2)
checkpoint = tf.train.Checkpoint(model=bert_encoder)
checkpoint.restore(
os.path.join(gs_folder_bert, 'bert_model.ckpt')).assert_consumed()
加载数据:
data, info = tfds.load('yelp_polarity_reviews', with_info=True, batch_size=-1, as_supervised=True)
train_x_orig, train_y_orig = tfds.as_numpy(data['train'])
train_x = encode_examples(train_x_orig)
train_y = train_y_orig
使用 BERT 嵌入数据:
encoder_output = bert_encoder.predict(train_x)
设置模型:
inputs = keras.Input(shape=(768,))
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(8, activation='relu')(x)
outputs = keras.layers.Dense(1, activation='sigmoid')(x)
model = keras.Model(inputs=inputs, outputs=outputs)
sgd = SGD(lr=0.0001)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
火车:
model.fit(encoder_output[0], train_y, batch_size=64, epochs=3)
# encoder_output[0].shape === (10000, 1, 768)
# y_train.shape === (100000,)
训练结果:
Epoch 1/5
157/157 [==============================] - 1s 5ms/step - loss: 0.6921 - accuracy: 0.5455
Epoch 2/5
157/157 [==============================] - 1s 5ms/step - loss: 0.6918 - accuracy: 0.5455
Epoch 3/5
157/157 [==============================] - 1s 5ms/step - loss: 0.6915 - accuracy: 0.5412
Epoch 4/5
157/157 [==============================] - 1s 5ms/step - loss: 0.6913 - accuracy: 0.5407
Epoch 5/5
157/157 [==============================] - 1s 5ms/step - loss: 0.6911 - accuracy: 0.5358
我尝试了不同的学习率,但主要问题似乎是训练需要 1 秒并且准确度保持在 ~0.5。我没有正确设置输入/模型吗?
解决方案
推荐阅读
- c# - 如何处理 Angular 和后端 API CORE 之间长时间运行的 http 请求
- python - 获取数据框第一行的正确方法是什么?
- laravel - 当条件为真时搜索多列并加入另一个查询
- c# - 简单的 ASP.NET Core 路由出错
- reactjs - 无法使 react-player 灯光道具始终为真
- sql - 如何匹配令牌后的字符串(使用正则表达式)?
- r - K-mean 聚类导致不同的数据集
- google-cloud-sql - 是否可以在 google postgres cloud sql 中支持 orafce
- python - 在数据帧类型错误中出错:“系列”对象是可变的,因此它们不能被散列
- html - 我将 YouTube 嵌入代码放在我的网站中,但我无法禁用共享按钮帮助我解决这个问题