问题描述
我正在尝试使用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()
找出要执行的操作),一切正常!