在instructions included in the model之后,--training_crop_size
被设置为比训练图像大得多的值。例如:
python deeplab/train.py \
--logtostderr \
--training_number_of_steps=90000 \
--train_split="train" \
--model_variant="xception_65" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--train_crop_size="769,769" \
--train_batch_size=1 \
--dataset="cityscapes" \
--tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
--train_logdir=${PATH_TO_TRAIN_DIR} \
--dataset_dir=${PATH_TO_DATASET}
但是此选项实际上是做什么的?是否对每个训练图像进行随机裁剪?如果是这样,输入尺寸是否会更小,例如按照示例为769x769(WxH)?按照说明,评估作物大小设置为2049x1025。在不建议调整图像大小的情况下,输入尺寸为769x769的网络如何采用2049x1025的输入?会出现形状不匹配的问题。
说明有冲突吗?
答案 0 :(得分:0)
似乎他们在评估期间使用了完整图像。通常通过对最后一个卷积层中的较大张量求平均来完成。他们还提到,由于要进行完整的图像评估,因此必须将作物尺寸设置为数据集中可用图像的最大尺寸。
答案 1 :(得分:0)
是的,在您的情况下,似乎在训练过程中裁剪了图像。这样可以在系统的计算限制内实现更大的批处理大小。较大的批处理量导致优化步骤基于多个实例,而不是每个优化(=培训)步骤仅考虑一个(或很少)实例。这通常会带来更好的结果。通常,使用随机裁剪来确保对图像的所有部分进行网络训练。
“完全卷积”的CNN的训练或部署不需要固定的输入大小。通过在输入边缘使用填充,二维度降低通常由2 ^ n倍(由跨步或合并引起)表示。示例:在解码器再次对其进行升采样之前,您的编码器将每个空间尺寸减小2 ^ 4倍。 ->因此,您只需要确保输入尺寸是2 ^ 4的倍数即可(确切的输入尺寸无关紧要,它只是在训练期间定义网络隐藏层的空间尺寸)。在使用deeplab的情况下,框架会自动将给定的输入尺寸调整为所需的2 ^ x倍数,以使您使用起来更加轻松。
永远不要随意裁剪评估实例,因为只有确定性的评估过程才能保证有意义的评估结果。在评估过程中,没有优化,一个批次的大小就可以了。