如何在“ fit”调用期间调试Tensorflow logits /标签形状问题?

问题描述

我正在尝试使用TensorFlow训练分段U-Net。在运行模型之前,对计算机上的图像数据集进行了预处理,并保存为Tfrecords。

因此,在训练之前,我用tf.data加载tfrecords。如果我看一个例子,就会明白:

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 =通道暗淡):

BatchImg0: (6,96,1)
BatchSeg0: (6,1)

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

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

输出

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

我不确定如何在这里进一步调试...谢谢您的帮助!

解决方法

正如安德雷(Andrey)指出的(谢谢!),我不仅需要检查输入的图像形状,还需要检查模型(logit)形状的输出。问题仅来自对数和分割之间的形状差异(最后一维中的“ 16”与1)。因此模型输出不正确。修复问题后(使用model.summary()找出要执行的操作),一切正常!