DeepLab 的 --train_crop_size 实际上做了什么?
What does DeepLab's --train_crop_size actually do?
在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) 作为示例?按照说明,eval crop 大小设置为 2049x1025。当没有图像调整大小的建议时,输入尺寸为 769x769 的网络如何采用 2049x1025 输入?会出现形状不匹配的问题。
指令有冲突吗?
他们似乎在评估期间使用了完整图像。它通常是通过在最后一个卷积层中平均一个更大的张量来完成的。他们还提到,由于完整的图像评估,裁剪尺寸必须设置为数据集中可用图像的最大尺寸。
是的,在您的情况下,图像似乎在训练过程中被裁剪了。这可以在系统的计算限制范围内实现更大的批处理大小。较大的批量大小会导致基于多个实例的优化步骤,而不是每个优化(=训练)步骤仅考虑一个(或非常少的)实例。这通常会带来更好的结果。通常使用随机裁剪来确保网络在图像的所有部分上都经过训练。
"fully convolutional" CNN 的训练或部署不需要固定的输入大小。通过在输入边缘使用填充,维度减少通常由 2^n 的因子表示(由跨步或池化引起)。示例:在解码器再次对其进行上采样之前,您的编码器将每个空间维度减少了 2^4 倍。 --> 所以你只需要确保你的输入维度是 2^4 的倍数(确切的输入大小并不重要,它只是在训练期间定义网络隐藏层的空间维度)。在 deeplab 的情况下,框架会自动将给定的输入维度调整为所需的 2^x 的倍数,以使其更易于使用。
永远不要随机裁剪评估实例,因为只有确定性的评估过程才能保证有意义的评估结果。在评估过程中,没有优化,一个批量大小就可以了。
在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) 作为示例?按照说明,eval crop 大小设置为 2049x1025。当没有图像调整大小的建议时,输入尺寸为 769x769 的网络如何采用 2049x1025 输入?会出现形状不匹配的问题。
指令有冲突吗?
他们似乎在评估期间使用了完整图像。它通常是通过在最后一个卷积层中平均一个更大的张量来完成的。他们还提到,由于完整的图像评估,裁剪尺寸必须设置为数据集中可用图像的最大尺寸。
是的,在您的情况下,图像似乎在训练过程中被裁剪了。这可以在系统的计算限制范围内实现更大的批处理大小。较大的批量大小会导致基于多个实例的优化步骤,而不是每个优化(=训练)步骤仅考虑一个(或非常少的)实例。这通常会带来更好的结果。通常使用随机裁剪来确保网络在图像的所有部分上都经过训练。
"fully convolutional" CNN 的训练或部署不需要固定的输入大小。通过在输入边缘使用填充,维度减少通常由 2^n 的因子表示(由跨步或池化引起)。示例:在解码器再次对其进行上采样之前,您的编码器将每个空间维度减少了 2^4 倍。 --> 所以你只需要确保你的输入维度是 2^4 的倍数(确切的输入大小并不重要,它只是在训练期间定义网络隐藏层的空间维度)。在 deeplab 的情况下,框架会自动将给定的输入维度调整为所需的 2^x 的倍数,以使其更易于使用。
永远不要随机裁剪评估实例,因为只有确定性的评估过程才能保证有意义的评估结果。在评估过程中,没有优化,一个批量大小就可以了。