Я использую модель U-Net библиотеки Python keras_unet_collection для самостоятельного обучения изображений (спектрограмм; dim=(376, 128)) для изучения масок фона/переднего плана. Я новичок в самостоятельном обучении, но, прочитав все соответствующие исследовательские работы, я разработал следующий подход:
основная истина (у):
входное изображение (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)
Я правда не могу этого понять. Любая помощь/предложение будет здорово!
Вероятно, вы столкнулись с проблемой, заключающейся в том, что размер входного изображения должен делиться на 2 ** N, где N — количество слоев фильтра в вашей модели.
Каждый слой на сужающемся пути (или левой стороне) U-Net делит количество пикселей в каждом измерении на два, позволяя при этом увеличить количество фильтров. На пути расширения каждый слой удваивает количество пикселей.
Однако количество пикселей всегда должно быть целым числом. Если у вас есть пять пикселей, вы разделите их на два и округлите в меньшую сторону, вы получите два пикселя. Удвойте это значение еще раз, и вы получите четыре пикселя, что больше не соответствует слою в пять пикселей.
Сравнивая это с вашим примером, у вас пять слоев, поэтому все входные фигуры должны делиться на 2 ** 5. Но 376 не делится на 32.
Это проблема из-за этапа конкатенации. При объединении входных данных из пути расширения с входными данными из пути сужения размеры должны быть совместимыми, за исключением оси, по которой вы объединяете. Итак, если бы у вас были фигуры (None, 46, 16, 512)
и (None, 46, 16, 512)
, это сработало бы. Однако у вас есть несоответствие в измерении 1.
Существуют различные способы справиться с этим.