在训练 UNet 进行图像分割时遇到问题

问题描述 投票:0回答:1

我正在使用 keras_unet_collection python 库的 U-Net 模型对图像(频谱图;dim=(376, 128))执行自监督学习,以学习背景/前景蒙版。我对自我监督学习非常陌生,但在阅读了所有相关研究论文后,我创建了这种方法:

  • 从音频文件生成频谱图(它们是事实)
  • 屏蔽频谱图的随机部分(输入图像) 我正在尝试训练 U-Net 模型来重建失真的频谱图,并在此过程中学习识别背景噪声,通过将每个像素分类为 0 或 1(其中 0 应该是背景)来消除图像/音频。

基本事实 (y):

输入图像(X):

但是我在创建模型时遇到了错误。

给定频谱图的 PIL 图像(img.size 返回 (376, 128)) 这就是我定义模型的方式:

model = models.unet_2d(input_size=(img.size[0], img.size[1], 3), 
                       filter_num=[64, 128, 256, 512, 1024],
                       stack_num_down=2, stack_num_up=1,
                       weights='imagenet', n_labels=1,
                       activation='GELU', output_activation='Softmax',
                       batch_norm=True, pool='max', unpool='nearest', name='unet')

我收到此错误:

ValueError:

Concatenate
层需要具有匹配形状的输入,除了连接轴之外。收到:input_shape=[(无, 46, 16, 512), (无, 47, 16, 512)]

这是堆栈跟踪:

> keras_unet_collection/_model_unet_2d.py:288
X = unet_2d_base(IN, filter_num, stack_num_down=stack_num_down, stack_num_up=stack_num_up, 
                      activation=activation, batch_norm=batch_norm, pool=pool, unpool=unpool, 
                      backbone=backbone, weights=weights, freeze_backbone=freeze_backbone, 
                      freeze_batch_norm=freeze_backbone, name=name)

> keras_unet_collection/_model_unet_2d.py:213
 X = UNET_right(X, [X_decode[i],], filter_num_decode[i], stack_num=stack_num_up, activation=activation, 
                        unpool=unpool, batch_norm=batch_norm, name='{}_up{}'.format(name, i))

> keras_unet_collection/_model_unet_2d.py:86
X = concatenate([X,]+X_list, axis=3, name=name+'_concat')

> keras/src/layers/merging/concatenate.py:172
return Concatenate(axis=axis, **kwargs)(inputs)

我实在是想不通这个问题。任何帮助/建议都会很棒!

python keras deep-learning semantic-segmentation unet-neural-network
1个回答
0
投票

您可能会遇到这样的问题:输入图像大小必须能被 2 ** N 整除,其中 N 是模型中滤波器层的数量。

U-Net 收缩路径(或左侧)的每一层将每个维度的像素数除以二,同时允许增加滤波器的数量。在扩展路径上,每一层的像素数量都会增加一倍。

但是,像素数始终必须是整数。如果有 5 个像素,将其除以 2 并向下舍入,则得到 2 个像素。再翻倍,你就得到了四个像素。

与您的示例相比,您有五层,因此所有输入形状必须能被 2 ** 5 整除。但是 376 不能被 32 整除。

这是一个问题,因为连接步骤。将扩展路径的输入与收缩路径的输入组合时,尺寸必须兼容,但要连接的轴除外。所以,如果你有

(None, 46, 16, 512)
(None, 46, 16, 512)
的形状,那就可以了。但是,维度 1 不匹配。

有多种方法可以处理这个问题。

  • 将原始图像填充、裁剪或调整大小为 2 ** N 的倍数。(这可能是最简单的 - 它不需要修改此库。)
  • 在 U-Net 中,在连接之前将一幅输入图像裁剪为较小图像的大小。
  • 在 U-Net 中,如果需要,在每层添加最多 1 行或一列填充。
© www.soinside.com 2019 - 2024. All rights reserved.