Возникла проблема при обучении UNet сегментации изображений

Я использую модель U-Net библиотеки Python keras_unet_collection для самостоятельного обучения изображений (спектрограмм; dim=(376, 128)) для изучения масок фона/переднего плана. Я новичок в самостоятельном обучении, но, прочитав все соответствующие исследовательские работы, я разработал следующий подход:

  • Генерируйте спектрограммы из аудиофайлов (они являются основной истиной)
  • Маскировать случайные участки спектрограмм (входные изображения) Я пытаюсь обучить модель U-Net восстанавливать искаженную спектрограмму и в процессе научиться определять фоновый шум для подавления изображения/аудио, классифицируя каждый пиксель как 0 или 1 (где 0 должен быть фоном).

основная истина (у):

входное изображение (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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, вы столкнулись с проблемой, заключающейся в том, что размер входного изображения должен делиться на 2 ** N, где N — количество слоев фильтра в вашей модели.

Каждый слой на сужающемся пути (или левой стороне) U-Net делит количество пикселей в каждом измерении на два, позволяя при этом увеличить количество фильтров. На пути расширения каждый слой удваивает количество пикселей.

Однако количество пикселей всегда должно быть целым числом. Если у вас есть пять пикселей, вы разделите их на два и округлите в меньшую сторону, вы получите два пикселя. Удвойте это значение еще раз, и вы получите четыре пикселя, что больше не соответствует слою в пять пикселей.

Сравнивая это с вашим примером, у вас пять слоев, поэтому все входные фигуры должны делиться на 2 ** 5. Но 376 не делится на 32.

Это проблема из-за этапа конкатенации. При объединении входных данных из пути расширения с входными данными из пути сужения размеры должны быть совместимыми, за исключением оси, по которой вы объединяете. Итак, если бы у вас были фигуры (None, 46, 16, 512) и (None, 46, 16, 512), это сработало бы. Однако у вас есть несоответствие в измерении 1.

Существуют различные способы справиться с этим.

  • Дополните, обрежьте или измените размер исходного изображения до значения, кратного 2 ** N. (Вероятно, это самый простой вариант — не требуется изменять эту библиотеку.)
  • В U-Net перед объединением обрежьте одно входное изображение до размера меньшего изображения.
  • При необходимости в U-Net добавьте до 1 строки или столбца заполнения на каждом слое.

Другие вопросы по теме

Похожие вопросы

Бинарная кроссэнтропия Tensorflow всегда предсказывает одно и то же значение
Асинхронный/параллельный подход к работе с (потенциально) растущей очередью задач
Текст JSON в качестве аргумента командной строки при запуске скрипта Python
Очистить новости проигрывателя rotowire MLB и сформировать их в таблицу с помощью Python
Невозможно выбрать параметры из раскрывающегося списка «Администратор» или ESS для сайта Orange HRM для роли пользователя
Неправильный вывод (но очень близкий) при добавлении значений с одного листа на другой с помощью openpyxl
Обеспечение автодополнения VSCode Python
Поднятый виджет ttk.Label не может оперативно перерисоваться?
Я получаю сообщение об ошибке malloc «Double Free Error» в своих последних сценариях Python, когда пытаюсь вставить данные на свой удаленный сервер postgresql
Решение проблемы нулевой частоты в преобразовании Фурье для задач электростатики