【问题标题】:How to implement random cropping during training?训练时如何实现随机裁剪?
【发布时间】:2021-05-11 21:45:44
【问题描述】:

我正在开发一个类似 U-net 的模型,该模型可以在多发性硬化症患者的两个时间点之间分割大脑受损组织。该模型的基线和后续图像为 x,分割掩码为 y。这些图像是 3D (192, 218, 192),模型输入大小是 (128, 128, 128),并且正在通过 dice loss 进行训练。模型基于这篇论文:https://www.sciencedirect.com/science/article/abs/pii/S0895611120300732

我目前正在做的是在训练之前对每张图像进行中心裁剪,训练骰子分数似乎学习得很好,但在验证数据中却不是。

我已经阅读了 10 次左右的随机裁剪有助于减少过度拟合,但我并不完全知道如何实现它。我写了这个函数来做随机裁剪:

def random_crop(img_bl, img_fu, mask, width=128, height=128, depth=128):
    x = random.randint(0, img_bl.shape[1] - width)
    y = random.randint(0, img_bl.shape[0] - height)
    z = random.randint(0, img_bl.shape[2] - depth)
    img_bl = img_bl[y:y + height, x:x + width, z:z + depth]
    img_fu = img_fu[y:y + height, x:x + width, z:z + depth]
    mask = mask[y:y + height, x:x + width, z:z + depth]

    return img_bl, img_fu, mask

我是否只是在对每张图像进行训练之前应用此功能 10 次?或者有没有办法在模型中包含随机裁剪并重叠这 10 个子卷的预测?

【问题讨论】:

    标签: python tensorflow deep-learning conv-neural-network data-augmentation


    【解决方案1】:

    您可以在 Tensorflow 中通过 tf.image.random_crop 函数裁剪图像。

    cropped=tf.image.random_crop(image, (PATCH_SIZE,PATCH_SIZE,3))
    

    要在您的情况下裁剪 3D 模型,您还可以设置通道参数

    cropped=tf.image.random_crop(model, (PATCH_SIZE_1,PATCH_SIZE_2,PATCH_SIZE_3))
    

    要将此裁剪精美地应用于您的输入管道,您可以使用 tf.keras.layers.Lambda 映射此函数,

    def crop_layer():
      def _crop_layer(x):
        return cropped=tf.image.random_crop(x, (PATCH_SIZE_1,PATCH_SIZE_2,PATCH_SIZE_3))
      return lambda x:_crop_layer(x)
    
    layer=tf.keras.layers.Lambda(crop_layer)(input)
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2017-12-18
      • 2018-10-17
      • 2020-08-21
      • 2013-04-14
      • 1970-01-01
      相关资源
      最近更新 更多