我'我试图使用deeplab3+ tensorflow实现来微调新的数据集(具有不同数量的类)。我将数据集转换为tfrecords并开始train模型没有问题。现在我想评估新检查点,运行evaluation脚本,并获得形状不匹配错误。
tensorflow.python.framework.errors_impl.InvalidArgumentError:形状不匹配
模型实现使用tensorflow.slim,我认为我的问题与函数
有关slim.evaluation.evaluation_loop(
master=FLAGS.master,
checkpoint_dir=FLAGS.checkpoint_dir,
logdir=FLAGS.eval_logdir,
num_evals=num_batches,
eval_op=list(metrics_to_updates.values()),
max_number_of_evaluations=num_eval_iters,
eval_interval_secs=FLAGS.eval_interval_secs,
hooks=[tf_debug.LocalCLIDebugHook()]))
我的错误记录
`tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape mismatch in tuple component 1. Expected [513,513,3], got [2448,2448,3]
[[Node: batch/padding_fifo_queue_enqueue = QueueEnqueueV2[Tcomponents=[DT_INT64, DT_FLOAT, DT_STRING, DT_INT32, DT_UINT8, DT_INT64], timeout_ms=-1, _device="/job:localhost/replica:0/task:0/device:CPU:0"](batch/padding_fifo_queue, Reshape_3/_4659, add_2/_4661, Reshape_1, add_3/_4663, case/cond/Merge/_4665, Reshape_6/_4667)]]`
我不理解这个错误,因为实施在培训和验证过程中使用相同的preprocessing例程。我也尝试使用tf_debug.LocalCLIDebugHook()进行调试,但它没有用。
答案 0 :(得分:1)
两种解决方案:
只需将eval_crop_size
/ vis_crop_size
更改为评估集中的最大图像尺寸即可。
使用tf.image.resize_image_with_pad
(不会改变长宽比)或tf.image.resize_images
(会改变长宽比但不填充)将您的评估大小调整为最大图像尺寸长度<513。
后面的主要原因是input_preprocess.py。下面的代码展示了如何对输入进行预处理以确保尺寸兼容性:填充图像(如果图像小于crop_size),然后裁剪(仅用于训练)。
# Pad image and label to have dimensions >= [crop_height, crop_width]
image_shape = tf.shape(processed_image)
image_height = image_shape[0]
image_width = image_shape[1]
target_height = image_height + tf.maximum(crop_height - image_height, 0)
target_width = image_width + tf.maximum(crop_width - image_width, 0)
# Randomly crop the image and label
if is_training and label is not None:
processed_image, label = preprocess_utils.random_crop(
[processed_image, label], crop_height, crop_width)
答案 1 :(得分:0)
它作为问题发布在github上,解决方案在此评论中:https://github.com/tensorflow/models/issues/3886#issuecomment-378996570
从那里复制粘贴:
为数据集设置eval_crop_size = output_stride * k + 1。 为最大图像尺寸为512的PASCAL图像设置默认值513。 我们选择k = 32,得到eval_crop_size = 16 * 32 + 1 = 513&gt; 512,因为我们会做整个图像推断。 类似于我们为Cityscapes图像所做的情况,我们设置了eval_crop_size = 1025x2049。