keras 值错误:形状(426530,2)和(1930,2)对于y_pred和y_test不兼容

flseospp  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(121)

我正在研究DistillBert项目的二进制分类。我尝试使用垃圾短信数据集运行以下代码(您也可以使用IMDB数据集,它也会出现同样的问题),我尝试找出召回率、精度和AUC得分。但是,我得到了一个值错误。
这里我使用了BinaryCrossentropy损失函数和Adam优化器。
数据集:这里使用的数据集是垃圾短信数据集,它的二进制标签为0表示标准短信,1表示垃圾短信。使用IMDB数据集可以重现相同的错误。
错误:

ValueError: Shapes (426530, 2) and (1930, 2) are incompatible

我在运行包含以下代码的选项卡时遇到此错误:

m = tf.keras.metrics.Recall()
m.update_state(y_test_encoded, y_pred)
m.result().numpy()

此处y_pred是预测标签,y_test_encoded是单热点编码的地面实况标签。此处用于预测的test_dataset是使用from_tensor_slices转换为TensorFlow数据集的标记化测试数据。我假设问题是由于预测标签和地面实况标签的形状不同。
编码:

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

#One-hot encoding of labels
y_train_encoded = tf.one_hot(y_train.values, 2)
y_test_encoded = tf.one_hot(y_test.values, 2)

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_encoded)))

test_dataset = 
tf.data.Dataset.from_tensor_slices((dict(test_encodings),list(y_test_encoded)))
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.BinaryCrossentropy((from_logits=True)

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

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

model.fit(train_dataset.shuffle(len(X_train)).batch(BATCH_SIZE),
      epochs=N_EPOCHS,
      batch_size=BATCH_SIZE)

predictions = model.predict(test_dataset)

y_pred = tf.round(tf.nn.sigmoid(predictions.logits))

m = tf.keras.metrics.Recall()
m.update_state(y_test_encoded, rounded_predictions)
m.result().numpy()
# This is where I getting the above-mentioned error.

如何修复错误并获得召回率、精确度和AUC评分?

xam8gpfp

xam8gpfp1#

OP是在测试集上进行预测,但将预测与原始的较大数据集进行比较。

predictions = model.predict(test_dataset)  # this data needs to be used for comparison below

变更:

m.update_state(y_test_encoded, rounded_predictions)

要在.predict()上包含数据集中的标签,请执行以下操作:

true_labels = # labels from test_dataset
m.update_state(true_labels, rounded_predictions)

相关问题