Python 如何在';适合';呼叫

Python 如何在';适合';呼叫,python,tensorflow,debugging,tensorflow2.x,Python,Tensorflow,Debugging,Tensorflow2.x,我正在尝试用TensorFlow训练一个分段U型网络。数据集“我的计算机上的图像”在运行模型之前进行预处理,并保存为Tfrecords 因此,在训练之前,我用tf.data加载tf记录。如果我看一个例子,我会得到: ds_train = tf.data.TFRecordDataset(training_tfrecords).map(load_image_train, num_parallel_calls=tf.data.experimental.AUTOTUNE) train_dataset =

我正在尝试用TensorFlow训练一个分段U型网络。数据集“我的计算机上的图像”在运行模型之前进行预处理,并保存为Tfrecords

因此,在训练之前,我用
tf.data
加载tf记录。如果我看一个例子,我会得到:

ds_train = tf.data.TFRecordDataset(training_tfrecords).map(load_image_train, num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = ds_train.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
one_record = train_dataset.take(1)
for i, (img, seg) in enumerate(one_record):
    print(f"BatchImg{i}: {img.shape}")
    print(f"BatchSeg{i}: {seg.shape}")
输出(6=批次大小,96=img尺寸,1=通道尺寸):

到目前为止看起来不错。但是,当我尝试开始培训时,我会出现以下错误:

model_history = model.fit(train_dataset, epochs=EPOCHS, steps_per_epoch=180)
输出:

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

我不知道如何在这里进一步调试。。。谢谢你的帮助

正如Andrey指出的(谢谢!),我不仅需要检查输入图像形状,还需要检查模型(logits)形状的输出。问题仅仅来自于逻辑图和分段图之间的形状差异(“16”与最后一个维度中的1)。因此,模型输出不正确。修复后(使用
model.summary()
找出要做的事情),一切正常

我看到最后一个输出至少有两个主要问题:图像形状(96^3)没有为分割(标签)复制,以及logit中突然出现的“16”…我将从调用模型开始,并确保其输出形状与数据集中的标签和丢失函数相关联,例如:a=模型(BatchImg0)。我没有使用U-Net。但看起来16是这个模型的输出形状。16可以是多个类。您使用的是哪种损失函数?嗨@Andrey谢谢您的回复!事实上,我正在排除这16个故障,它似乎是我的模型目前的输出。使用
tf.keras.loss.BinaryCrossentropy(from_logits=True)
Hi,Pierre。据我所知,二进制交叉熵要求输出形状为2(标签形状为2)。您的输出形状为16,标签形状为1。我正在将16修复回1。对于丢失,我在前面使用了tf1的
tf.nn.sigmoid\u cross\u entropy\u with\u logits
,但将所有内容转换为tf2
ValueError: logits and labels must have the same shape ((None, 96, 96, 96, 16) vs (None, None, None, None, 1))