将 `num_classes` 从 2 减少到 1,以便 AUC/TF/TN/FP/FN 指标有效?

问题描述

我有一些包含两个类的数据集。当我尝试使用某些指标(例如 tf.keras.metrics.AUCtf.keras.metrics.FalseNegativestf.keras.metrics.FalsePositivestf.keras.metrics.TrueNegativestf.keras.metrics.TruePositives)时,我收到类似于以下内容错误

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

我想我可以使用 tfa.metrics.MultiLabelConfusionMatrix 并为 PR 和 ROC 编写自己的 AUC。但说真的,我只有两节课。 AFAIK,两个班级相当于一个班级。

如何将我的 tfrecords 合并为一个类?


为了完整起见,这里有一个完整的工作示例,用于重新创建此错误,从导入、全局变量和争论开始:

from tempfile import mkdtemp
from os import path,mkdir
from shutil import rmtree
import tensorflow as tf
import numpy as np
from PIL import Image

NUM_CLASSES = 2
INPUT_SHAPE = 32,32,3


def create_random_ds(tempdir):
    for class_num in range(NUM_CLASSES):
        directory = path.join(tempdir,'class{}'.format(class_num))
        mkdir(directory)
        for i in range(20):
            Image \
              .fromarray((np.random.rand(100,100,3) * 255).astype('uint8')) \
              .convert('RGBA') \
              .save(path.join(directory,'image{}.png'.format(i)))

    return tf.keras.preprocessing.image_dataset_from_directory(
        tempdir,labels='inferred',label_mode='int',)

tempdirs = mkdtemp(),mkdtemp()

train_dataset = create_random_ds(tempdirs[0])
validation_dataset = create_random_ds(tempdirs[1])

然后CNN模型构建:

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(INPUT_SHAPE[0],(INPUT_SHAPE[-1],INPUT_SHAPE[-1]),activation='relu',),tf.keras.layers.MaxPooling2D((2,2)),tf.keras.layers.Conv2D(64,(3,3),activation='relu'),tf.keras.layers.Flatten(),tf.keras.layers.Dense(64,tf.keras.layers.Dense(NUM_CLASSES)
])

以肉结束:

try:
    model.compile(loss=tf.keras.losses.BinaryCrossentropy(from_logits=False),optimizer=tf.keras.optimizers.RMSprop(),metrics=['accuracy',tf.keras.metrics.AUC(curve="PR")
                          ])

    model.fit(train_dataset,epochs=2,validation_data=validation_dataset)
finally:
    for directory in tempdirs:
        rmtree(directory)
ValueError: Shapes (None,1) are incompatible

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)