Tensorflow DeepLab:元组组件1中的形状不匹配。预期[x,x,3],得到[y,y,3]

时间:2018-04-05 14:26:31

标签: python tensorflow deep-learning

我'我试图使用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()进行调试,但它没有用。

2 个答案:

答案 0 :(得分:1)

两种解决方案:

  • 只需将eval_crop_size / vis_crop_size更改为评估集中的最大图像尺寸即可。

  • 使用tf.image.resize_image_with_pad(不会改变长宽比)或tf.image.resize_images(会改变长宽比但不填充)将您的评估大小调整为最大图像尺寸长度<513。

    < / li>

后面的主要原因是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。