【问题标题】:Training design / sequential loading of images for Mask-RCNNMask-RCNN 的训练设计/图像顺序加载
【发布时间】:2020-07-25 08:39:49
【问题描述】:

我正在使用来自以下 git 存储库的 Mask RCNN 训练深度学习模型:matterport/Mask_RCNN。我依赖于我的数据集(原始数据集:59 张 1988x1355x3 的图像,每个图像 > 80 个注释)的大量扩充,我将其存储在本地(评估扩充的类型/程度与验证指标所必需的)。增强数据集包含 6000 张图像。由于降低了分辨率和仿射变换,该数据集在图像的 x 和 y 维度上有所不同 - 我假设不同的 x、y 维度不会影响最终测试。

但是,每当我加载超过“X”个图像来训练模型时,我的 Python 内核就会崩溃。

因此,我想出了将数据集拆分为子数据集并迭代子数据集的想法,使用“最后”训练的权重作为新一轮的起点。但我不确定结果是否相同(阅读:相同,考虑到“随机梯度下降”的随机性质)?

我想知道,如果我不遍历每个 epoch 的子数据集,而是训练 Y epoch(例如,20 只用于“heads”,10 用于“all layers”),结果是否相同?

但是,我确信这不是解决此问题的最有效方法。欢迎提出改进意见。

注意,我没有使用keras.preprocessing.image.ImageDataGenerator(),据我了解,它随机生成数据并通过替换纪元的输入将其提供给模型,而我想提供整个数据集到模型。

【问题讨论】:

    标签: python keras deep-learning data-augmentation


    【解决方案1】:
    1. 我想出了将数据集拆分为子数据集并迭代子数据集的想法,使用“最后”训练的权重作为新一轮的起点。但不知道结果会不会一样?

      • 您正在做与 ImageDataGenerator 正在做的事情相同的事情(创建您自己的小批量),但不是最理想的。结果在什么方面是一样的?

    如果您的意思是针对使用单个批次中的所有数据进行训练的模型? - 很可能不是。因为较低的批次意味着较慢的收敛。但这可以通过训练更多 epoch 来解决。

    另一个问题是可重复性。如果您想每次都以相同的结果重现您的模型,只需使用种子即可。

    import random
    random.seed(1)
    
    import numpy as np
    np.random.seed(1)
    
    import tensorflow
    tensorflow.random.set_seed(1)
    
    1. 另一个概念是梯度累积。它将帮助您以大批量训练您,而不会一次在内存中保留太多图像。

    https://github.com/CyberZHG/keras-gradient-accumulation

    1. 最后,keras.preprocessing.image.ImageDataGenerator() in fact 对整个数据集进行训练,它只是在每一步选择一个随机样本(您对所谓的子数据集做同样的事情)。

    您可以为 ImageDataGenerator 播种,使其具有可重复性,而不是完全随机的。

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 1970-01-01
      • 2018-02-04
      • 2019-11-17
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2015-09-09
      • 2022-06-23
      相关资源
      最近更新 更多