簡體   English   中英

當我使用“tf.keras.metrics.Recall()”時,得到“ValueError: Shapes (None, 2) and (None, 1) are incompatible”進行二進制分類

[英]Getting "ValueError: Shapes (None, 2) and (None, 1) are incompatible" for binary classification when I am using "tf.keras.metrics.Recall()"

我正在為二進制分類工作 DistillBert 項目。 我正在嘗試使用 Spam SMS 數據集運行以下代碼(您也可以使用 IMDB 數據集,它也給出了同樣的問題),它使用 'accuracy' 和 'sparse_categorical_accuracy' 運行良好,但是當我運行時會出錯使用 tf.keras.metrics.Recall() 或 tf.keras.metrics.AUC()。 這里我使用的是 SparseCategoricalCrossentropy loss function 和 Ada 優化器。

數據集 - 這里使用的數據集是垃圾短信數據集,其二進制標簽 0 表示正常短信,1 表示垃圾短信。 使用此代碼的 IMDB 數據集可以重現相同的錯誤。

錯誤 -

ValueError: Shapes (None, 2) and (None, 1) are incompatible

代碼 -

import pandas as pd
import tensorflow as tf
import transformers
from transformers import DistilBertTokenizer
from transformers import TFAutoModelForSequenceClassification
pd.set_option('display.max_colwidth', None)
MODEL_NAME = 'distilbert-base-uncased'
BATCH_SIZE = 8
N_EPOCHS = 3

train = pd.read_csv("train_set.csv", error_bad_lines=False)
test = pd.read_csv("test_set.csv", error_bad_lines=False)

X_train = train.text
X_test = test.text
y_train = train.label
y_test = test.label

tokenizer = DistilBertTokenizer.from_pretrained(MODEL_NAME)

train_encodings = tokenizer(list(X_train.values),
                        truncation=True, 
                        padding=True)
test_encodings = tokenizer(list(X_test.values),
                       truncation=True, 
                       padding=True)

train_dataset = 
tf.data.Dataset.from_tensor_slices((dict(train_encodings),list(y_train.values)))

test_dataset = 
tf.data.Dataset.from_tensor_slices((dict(test_encodings),list(y_test.values)))
test_dataset2 = test_dataset.shuffle(buffer_size=1024).take(1000).batch(16)

model = TFAutoModelForSequenceClassification.from_pretrained(MODEL_NAME)

optimizerr = tf.keras.optimizers.Adam(learning_rate=5e-5)

losss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

model.compile(optimizer=optimizerr,
          loss=losss,
          metrics= 
['accuracy','sparse_categorical_accuracy',tf.keras.metrics.Recall()])

print("Evaluate Base model on test data")
results = model.evaluate(test_dataset2)
print("test loss, test acc:", results)

如何獲得此代碼的召回率、精度、AUC 和其他指標分數?

先感謝您。

編輯 - 當我使用損失 function

loss=tf.keras.losses.BinaryCrossentropy(from_logits=True)

我得到的錯誤是 -

ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))

您通常不會將稀疏分類交叉熵用於二元分類問題。 只需使用二元交叉熵。 這很可能是張量大小不匹配的原因。

https://www.tensorflow.org/api_docs/python/tf/keras/losses/BinaryCrossentropy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM