alx*_*gal 5 python tensorflow bert-language-model huggingface-transformers
我正在使用 bert 进行具有 3 个标签的序列分类任务。为此,我使用带有tensorflow的huggingface转换器,更具体地说是带有bert-base-german-cased模型的TFBertForSequenceClassification类(是的,使用德语句子)。
我绝不是 NLP 方面的专家,这就是为什么我在这里几乎遵循这种方法: https: //towardsdatascience.com/fine-tuning-hugging-face-model-with-custom-dataset-82b8092f5333(进行了一些调整当然)
一切似乎都工作正常,但我从模型收到的输出却让我失望。以下只是上下文中的一些输出。
我与文章中的示例的主要区别是标签的数量。我有 3 个,而文章只介绍了 2 个。
我使用 sklearn.preprocessing 中的 LabelEncoder 来处理我的标签
label_encoder = LabelEncoder()
Y_integer_encoded = label_encoder.fit_transform(Y)
Run Code Online (Sandbox Code Playgroud)
*这里是一个字符串标签列表,所以像这样
['e_3', 'e_1', 'e_2',]
Run Code Online (Sandbox Code Playgroud)
然后变成这样:
array([0, 1, 2], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
然后,我使用 BertTokenizer 处理文本并创建输入数据集(训练和测试)。这些是它们的形状:
<TensorSliceDataset shapes: ({input_ids: (99,), token_type_ids: (99,), attention_mask: (99,)}, ()), types: ({input_ids: tf.int32, token_type_ids: tf.int32, attention_mask: tf.int32}, tf.int32)>
Run Code Online (Sandbox Code Playgroud)
然后,我按照 Huggingface 文档训练模型。
训练模型的最后一个时期如下所示:
Epoch 3/3
108/108 [==============================] - 24s 223ms/step - loss: 25.8196 - accuracy: 0.7963 - val_loss: 24.5137 - val_accuracy: 0.7243
Run Code Online (Sandbox Code Playgroud)
然后我对一个例句运行 model.predict 并获得此输出(是的,我相应地标记了该句子,就像其他文章一样)。输出如下所示:
array([ 3.1293588, -5.280143 , 2.4700692], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
最后,这是我最终应用的 softmax 函数及其输出:
tf_prediction = tf.nn.softmax(tf_output, axis=0).numpy()[0]
output: 0.6590041
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题:我不太明白这个输出。我的模型的准确度约为 70%(验证准确度),应该可以很好地预测标签。然而,只有直接输出的 logits 对我来说意义不大,而且 softmax 函数之后的输出似乎是线性尺度的,就好像它来自 sigmoid 函数一样。我如何解释这一点并将其转换为我试图预测的标签?
另外:我不应该将一个热编码标签输入到我的 bert 模型中以使其正常工作吗?我一直认为伯特需要这个,但看起来不需要。
你的输出意味着第一类的概率是 65.9%。
您可以将标签作为整数或 one-hot 向量提供。您必须使用适当的损失函数(带有one-hot的categorical_crossentropy或带有整数的sparse_categorical_crossentropy)。
| 归档时间: |
|
| 查看次数: |
5348 次 |
| 最近记录: |