У меня есть набор данных, содержащий изображения в оттенках серого, и я хочу обучить на них современный CNN. Я очень хотел бы точно настроить предварительно подготовленную модель (например, здесь).
Проблема в том, что почти все модели, на которых я могу найти вес, были обучены набору данных ImageNet, который содержит изображения RGB.
Я не могу использовать одну из этих моделей, потому что их слой ввода ожидает пакетную форму (batch_size, height, width, 3)
или (64, 224, 224, 3)
в моем случае, но мои партии изображений (64, 224, 224)
.
Есть ли способ, которым я могу использовать одну из этих моделей? Я подумал о том, чтобы удалить слой ввода после того, как я загрузил весы и добавил свой собственный (как мы делаем для верхних слоев). Правильно ли этот подход?
Архитектура модели не может быть изменена, поскольку весы прошли обучение для конкретной конфигурации ввода. Замена первого слоя на свой собственный в значительной степени сделает остальную массу бесполезной.
- Редактирование: разработка, предложенная Prune--
CNN построены так, что по мере их углубления они могут извлекать высокоуровневые функции, полученные из функций нижнего уровня, которые были извлечены предыдущими слоями. Удалив исходные слои CNN, вы уничтожаете эту иерархию функций, потому что последующие слои не получат тех функций, которые они должны использовать в качестве своего ввода. В вашем случае второй слой был обучен ожидать функций первого слоя. Заменяя свой первый слой случайными весами, вы по существу выбрасываете любое обучение, которое было сделано на последующих слоях, поскольку их нужно будет переучивать. Я сомневаюсь, что они могли бы сохранить любые знания, полученные в ходе начальной подготовки.
--- конец редактировать ---
Однако есть простой способ, с помощью которого ваша модель может работать с изображениями в оттенках серого. Вам просто нужно заставить изображение казаться RGB. Самый простой способ сделать это - повторить массив изображений 3 раза в новом измерении. Поскольку у вас будет одинаковое изображение по всем трем каналам, производительность модели должна быть такой же, как на изображениях RGB.
В numpy это можно легко сделать следующим образом:
print(grayscale_batch.shape) # (64, 224, 224)
rgb_batch = np.repeat(grayscale_batch[..., np.newaxis], 3, -1)
print(rgb_batch.shape) # (64, 224, 224, 3)
Способ, которым это работает, заключается в том, что он сначала создает новое измерение (для размещения каналов), а затем повторяет существующий массив 3 раза в этом новом измерении.
Я также уверен, что keras ' ImageDataGenerator может загружать изображения в оттенках серого как RGB.
почему бы не попытаться преобразовать изображение в оттенках серого в изображение RGB?
tf.image.grayscale_to_rgb(
images,
name=None
)