Как я могу использовать предварительно обученную нейронную сеть с изображениями в градациях серого?

1

У меня есть набор данных, содержащий изображения в оттенках серого, и я хочу обучить на них современный CNN. Я очень хотел бы точно настроить предварительно подготовленную модель (например, здесь).

Проблема в том, что почти все модели, на которых я могу найти вес, были обучены набору данных ImageNet, который содержит изображения RGB.

Я не могу использовать одну из этих моделей, потому что их слой ввода ожидает пакетную форму (batch_size, height, width, 3) или (64, 224, 224, 3) в моем случае, но мои партии изображений (64, 224, 224).

Есть ли способ, которым я могу использовать одну из этих моделей? Я подумал о том, чтобы удалить слой ввода после того, как я загрузил весы и добавил свой собственный (как мы делаем для верхних слоев). Правильно ли этот подход?

  • 0
    Вы можете попробовать удалить входной слой и добавить свой собственный. Тогда вы можете попытаться тренировать только этот слой. Если вы не увидите, как убыток уменьшается, когда все остальные слои заблокированы, это не сработает для вас.
  • 6
    Не спрашивайте нас , верен ли этот подход: спросите компьютер! Попробуй! Другой подход состоит в том, чтобы утроить входные векторы: передать значения шкалы серого для всех трех цветовых слоев.
Показать ещё 3 комментария
Теги:
tensorflow
machine-learning
keras
deep-learning

2 ответа

4
Лучший ответ

Архитектура модели не может быть изменена, поскольку весы прошли обучение для конкретной конфигурации ввода. Замена первого слоя на свой собственный в значительной степени сделает остальную массу бесполезной.

- Редактирование: разработка, предложенная 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.

  • 1
    Простое наложение 1-канальных изображений легко, но вопрос не в том, как создать 3-канальное изображение, а в том, может ли он использовать предварительно обученную модель для классификации, когда его исходные изображения 1-канальные, и я думаю, что ответ, вероятно, нет
  • 1
    Это в значительной степени стандартный подход при работе с изображениями в градациях серого. Я сделал это пару раз, и он работает нормально, его установка по умолчанию в ImageDataGenerator в keras для загрузки изображения в градациях серого повторяется 3 раза. Думайте об этом как обратное преобразование RGB -> оттенки серого (где серый = (R + B + G) / 3).
Показать ещё 7 комментариев
0

почему бы не попытаться преобразовать изображение в оттенках серого в изображение RGB?

tf.image.grayscale_to_rgb(
    images,
    name=None
)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню