问题描述
我有一些包含两个类的数据集。当我尝试使用某些指标(例如 tf.keras.metrics.AUC
、tf.keras.metrics.FalseNegatives
、tf.keras.metrics.FalsePositives
、tf.keras.metrics.TrueNegatives
或 tf.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 (将#修改为@)