【问题标题】:Tensorflow object detection -- Increasing batch size leads to failureTensorFlow 对象检测——增加批量大小会导致失败
【发布时间】:2020-01-28 22:37:47
【问题描述】:

我一直在尝试使用 tensorflow 对象检测 API 训练对象检测模型。

batch_size 为 1 时网络训练良好。但是,增加batch_size 会导致经过一些步骤后出现以下错误。

网络:Faster RCNN

train_config: {
  batch_size: 1
  optimizer {
    momentum_optimizer: {
      learning_rate: {
        manual_step_learning_rate {
          initial_learning_rate: 0.0002
          schedule {
            step: 25000
            learning_rate: .00002
          }
          schedule {
            step: 50000
            learning_rate: .000002
          }
        }
      }
      momentum_optimizer_value: 0.9
    }
    use_moving_average: false
  }

错误

INFO:tensorflow:Error 报告给 Coordinator: , ConcatOp : 输入的维度应该匹配:shape[0] = [1,841,600,3] 与 shape[3] = [1,776,600,3]
[[节点连接(定义在/home//.virtualenvs/dl4cv/lib/python3.6/site-packages/object_detection-0.1-py3.6.egg/object_detection/legacy/trainer.py:190)]]
错误可能源于输入操作。
连接到节点 concat 的输入源操作:
Preprocessor_3/sub(定义在 /home//.virtualenvs/dl4cv/lib/python3.6/site-packages/object_detection-0.1-py3.6.egg/object_detection/models/faster_rcnn_inception_v2_feature_extractor.py:100)

增加 batch_size 的训练在 SSD mobilenet 上有效。
虽然,我目前已经为我的用例解决了这个问题,在 SO 中发布了这个问题以了解这种行为的原因。

【问题讨论】:

    标签: tensorflow deep-learning object-detection-api transfer-learning pre-trained-model


    【解决方案1】:

    出现错误的原因是,从技术上讲,您无法在单个 GPU 上以批处理模式训练 Faster RCNN。这是由于它的两级架构。 SSD 是单级的,因此可以并行化以提供更大的批量大小。如果您仍想训练批量大小>1 的 F-RCNN,则可以使用多个 GPU。您需要将 --num_clones 参数设置为可用的 GPU 数量。设置 num_clones 和 batchsize 以保存值(它应该等于您可用的 GPU 数量) 我在我的应用程序中使用了 4,8 和 16 的批量。 --num_clones=2 --ps_tasks=1 检查此链接以获取更多详细信息 https://github.com/tensorflow/models/issues/1744

    【讨论】:

      【解决方案2】:

      仅从错误来看,您的个人输入似乎具有不同的大小。我想它会尝试将 (ConcatOp) 4 个单个输入连接到一个张量中以构建一个小批量作为输入。

      在尝试连接时,它有一个输入与841x600x3 和一个输入与776x600x3(忽略批处理维度)。所以显然 841 和 776 不相等,但它们应该相等。批量大小为 1 时,可能不会调用 concat 函数,因为您不需要连接输入来获得小批量。似乎也没有其他组件依赖于预定义的输入大小,因此网络将正常训练或至少不会崩溃。

      我会检查您正在使用的数据集并检查这是否应该是这种方式,或者您有一些错误的数据样本。如果数据集没问题并且这实际上可能发生,您需要将所有输入的大小调整为某种预定义的分辨率,以便能够将它们组合成一个小批量。

      【讨论】:

      • 谢谢!一些图像具有不同的大小,因为它们是预期的。我的问题是batch_size 在为同一批图像训练 SSD 时没有问题,但是在训练 FRCNN 时会引发错误。
      • 这是相同的代码吗?也许 SSD 的代码会为您调整大小或其他什么。
      • 对此进行了一些研究,似乎是正确的。虽然 frcnn 配置不会调整任何类型的图像大小,但 ssd 的配置会调整批处理中所有图像的大小。我将收集更多信息,然后发布答案。感谢您的投入!
      【解决方案3】:

      您无需调整数据集中每张图片的大小。如果您在配置文件中指定,Tensorflow 可以处理它。

      默认的 frcnn 和 ssd 配置是:

      ## frcnn
         image_resizer {
            keep_aspect_ratio_resizer {
              min_dimension: 600
              max_dimension: 1024
            }
          }
          
      ## ssd
         image_resizer {
            fixed_shape_resizer {
              height: 300
              width: 300
            }
          }

      如果你将frcnn的image resizer改成ssd中的fixed_shape_resizer,你可以增加batch size。

      我实施了它,培训进展顺利。不幸的是,我的损失并没有像我预期的那样减少。然后,我切换回具有 4 个工人的批次大小 4(这意味着每个工人的批次大小为 1)。后者更适合我的情况,但可能对您的情况有所不同。

      【讨论】:

        【解决方案4】:

        当增加批量大小时,张量中加载的图像应该都是相同大小的。

        这就是您可以使图像全部具有相同大小的方法:

        image_resizer {
          keep_aspect_ratio_resizer {
            min_dimension: 896
            max_dimension: 896
            pad_to_max_dimension: true
          }
        }
        

        将图像填充到最大尺寸,使其“真实”,这将导致图像全部具有相同的大小。这使您能够拥有大于 1 的批量大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-25
          • 2021-10-20
          • 1970-01-01
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 2017-08-23
          • 2019-06-17
          相关资源
          最近更新 更多