Архитектуры CNN для регрессии?

32

Я работал над проблемой регрессии, когда входной сигнал представляет собой изображение, а метка представляет собой непрерывное значение между 80 и 350. Изображения имеют некоторые химические вещества после реакции. Цвет, который получается, указывает концентрацию другого химического вещества, которое осталось, и это то, что модель должна вывести - концентрацию этого химического вещества. Изображения можно поворачивать, переворачивать, отражать, и ожидаемый результат должен быть таким же. Этот вид анализа проводится в реальных лабораториях (очень специализированные машины выводят концентрацию химических веществ с использованием цветового анализа, как я тренирую эту модель).

До сих пор я экспериментировал только с моделями, основанными примерно на VGG (множественные последовательности блоков conv-conv-conv-pool). Прежде чем экспериментировать с более поздними архитектурами (Inception, ResNets и т. Д.), Я подумал, что я буду исследовать, существуют ли другие архитектуры, более часто используемые для регрессии с использованием изображений.

Набор данных выглядит следующим образом:

введите описание изображения здесь

Набор данных содержит около 5000 выборок размером 250x250, размер которых я изменил до 64x64, чтобы облегчить обучение. Как только я найду перспективную архитектуру, я поэкспериментирую с изображениями с большим разрешением.

До сих пор мои лучшие модели имели среднеквадратичную ошибку как для тренировочных, так и для проверочных наборов около 0,3, что далеко не приемлемо в моем случае использования.

Моя лучшая модель до сих пор выглядит так:

// pseudo code
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=32, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=64, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = conv2d(x, filters=128, kernel=[3,3])->batch_norm()->relu()
x = maxpool(x, size=[2,2], stride=[2,2])

x = dropout()->conv2d(x, filters=128, kernel=[1, 1])->batch_norm()->relu()
x = dropout()->conv2d(x, filters=32, kernel=[1, 1])->batch_norm()->relu()

y = dense(x, units=1)

// loss = mean_squared_error(y, labels)

Вопрос

Какова соответствующая архитектура для регрессионного вывода из ввода изображения?

редактировать

Я перефразировал свое объяснение и удалил упоминания о точности.

Редактировать 2

Я реструктурировал свой вопрос так, надеюсь, понятно, что я после

Rodrigo-Силвейра
источник
4
Точность не является мерой, которая может быть непосредственно применена к проблемам регрессии. Что вы имеете в виду, когда говорите, что ваша точность составляет 30%? Точность действительно относится только к задачам классификации, а не к регрессии.
Ядерный Ван
1
Что вы подразумеваете под "правильно предсказывает 30% времени" ? Вы действительно делаете регресс?
Firebug
1
Почему вы называете эту проблему регрессией? Вы не пытаетесь классифицировать по ярлыкам? ярлыки кардинальные?
Аксакал
2
Я не хочу то же самое, что VGG. Я делаю что-то похожее на vgg, что означает серию конв, за которыми следует максимальное объединение, а затем полностью подключенное. Похоже, универсальный подход для работы с изображениями. Но опять же, в этом весь смысл моего первоначального вопроса. Кажется, что все эти комментарии, хотя и проницательны для меня, полностью упускают суть того, что я спрашиваю в первую очередь.
Родриго-Сильвейра
1
Кроме того, мы могли бы оказать более эффективную помощь, если вы дадите более подробное описание проблемы. 1) Какие изображения? Каково их разрешение? Какая связь между изображениями и вашим ответом, ? Является ли это отношение инвариантным относительно поворота, то есть, если я поверну ваше круговое изображение на произвольный угол , ожидаю ли я, что изменится? 2) Знаете ли вы, что 5000 изображений для обучения архитектуры VGG-сети - это несчастье? Вы рассчитали количество параметров вашей архитектуры? Есть ли способ получить больше изображений? Если вы не можете, тогда, может быть, вам нужно ...θ yy[80,350]θy
DeltaIV

Ответы:

42

Прежде всего, общее предложение: выполните поиск литературы, прежде чем начинать эксперименты по теме, с которой вы не знакомы. Вы сэкономите много времени.

В этом случае, глядя на существующие документы, вы могли заметить, что

  1. CNN использовались многократно для регрессии: это классика, но она старая (да, в DL 3 года). Более современная газета не использовала бы AlexNet для этой задачи. Это более поздняя версия, но она решает гораздо более сложную проблему (трехмерное вращение), и в любом случае я не знаком с ней.
  2. Регрессия с CNN не является тривиальной проблемой. Посмотрев снова на первый документ, вы увидите, что у них есть проблема, когда они могут генерировать бесконечные данные. Их цель - предсказать угол поворота, необходимый для выпрямления 2D-изображений. Это означает, что я могу в основном взять свой тренировочный набор и увеличить его, поворачивая каждое изображение на произвольные углы, и я получу действительный, больший тренировочный набор. Таким образом, проблема кажется относительно простой с точки зрения проблем глубокого обучения. Кстати, обратите внимание на другие приемы увеличения данных, которые они используют:

    Мы используем трансляции (до 5% от ширины изображения), регулировку яркости в диапазоне [−0,2, 0,2], гамма-регулировку с помощью γ ∈ [−0,5, 0,1] и гауссов пиксельный шум со стандартным отклонением в диапазоне [0 0,02].

    Я недостаточно хорошо знаю вашу проблему, чтобы сказать, имеет ли смысл учитывать изменения положения, яркости и гамма-шума для ваших фотографий, тщательно снятых в лаборатории. Но вы всегда можете попробовать и удалить его, если это не улучшит потерю тестового набора. На самом деле, вы должны действительно использовать набор проверки или перекрестную проверку -кратности для такого рода экспериментов, и не смотрите на набор тестов, пока не определите свою настройку, если вы хотите, чтобы потеря набора тестов была репрезентативной для ошибка обобщения.k

    В любом случае, даже в идеальных условиях наивный подход не сработал так хорошо (раздел 4.2 ). Они удалили выходной слой (слой softmax) и заменили его слоем с двумя единицами, которые предсказывали бы синус и косинус угла поворота. Фактический угол будет вычисляться как . Нейронная сеть также прошла предварительную подготовку в ImageNet (это называется трансферным обучением).yxα=atan2(y,x)> 11 % [ - 180 ° , - 90 ° ] , [ - 90 ° , 0 ° ] , [ 0 ° , 90 ° ] [ 90 ° , 180 ° ] [ - 45 ° , 45 ° ]). Конечно, обучение в ImageNet было для другой задачи (классификации), но тренировка нейронной сети с нуля, должно быть, дала такие ужасные результаты, что они решили не публиковать их. Таким образом, у вас были все ингредиенты, чтобы сделать хороший омлет: потенциально бесконечные тренировочные данные, предварительно обученная сеть и, по-видимому, простая регрессионная проблема (предсказать два числа между -1 и 1). Тем не менее, лучшее, что они могли получить при таком подходе, - это ошибка 21 °. Не ясно, является ли это ошибкой RMSE, ошибкой MAD ​​или чем-то еще, но все же она не велика: поскольку максимальная ошибка, которую вы можете сделать, составляет 180 °, средняя ошибка от максимально возможной ошибки. Они сделали немного лучше, используя две сети последовательно: первая будет выполнять классификацию (предсказать, будет ли угол в>11%[180°,90°],[90°,0°],[0°,90°] или ), затем изображение, повернутое на величину, предсказанную первой сетью , будет передаваться в другую нейронную сеть (для регрессии, на этот раз), которая будет предсказывать окончательное дополнительное вращение в диапазоне .[90°,180°][45°,45°]

    В случае гораздо более простой проблемы (с поворотом MNIST) вы можете получить что-то лучше , но все равно вы не опускаетесь ниже ошибки RMSE, которая составляет от максимально возможной ошибки.2.6%

Итак, что мы можем извлечь из этого? Прежде всего, эти 5000 изображений - это небольшой набор данных для вашей задачи. В первой статье использовалась сеть, которая была предварительно обучена на изображениях, похожих на ту, для которой они хотели изучить задачу регрессии: вам нужно не только изучить задачу, отличную от той, для которой была разработана архитектура (классификация), но ваш тренировочный набор не совсем не похоже на тренировочные наборы, на которых обычно обучаются эти сети (CIFAR-10/100 или ImageNet). Таким образом, вы, вероятно, не получите никакой выгоды от трансферного обучения. Пример MATLAB имел 5000 изображений, но они были черно-белыми и семантически все очень похожи (ну, это может быть и ваш случай).

Тогда насколько реалистично становится лучше, чем 0,3? Прежде всего мы должны понять, что вы имеете в виду под средним убытком 0,3. Вы имеете в виду, что ошибка RMSE составляет 0,3,

1Ni=1N(h(xi)yi)2

где - это размер вашего тренировочного набора (таким образом, ), - это выход вашего CNN для image а - соответствующая концентрация химического вещества? Начиная с , если предположить, что вы прогнозы вашего CNN между 80 и 350 (или просто используете логит, чтобы подогнать их под этот интервал), вы получаете ошибку менее . Серьезно, что вы ожидаете? это не кажется мне большой ошибкой вообще.NN<5000h(xi)xiyiyi[80,350]0.12%

Кроме того, просто попробуйте вычислить количество параметров в вашей сети: я спешу и, возможно, я делаю глупые ошибки, поэтому непременно проверяйте мои вычисления с какой-либо summaryфункцией из любой используемой вами среды. Тем не менее, примерно я бы сказал, что у вас есть

9×(3×32+2×32×32+32×64+2×64×64+64×128+2×128×128)+128×128+128×32+32×32×32=533344

(обратите внимание, что я пропустил параметры слоев пакетной нормы, но это всего лишь 4 параметра для слоя, поэтому они не имеют значения). У вас есть полмиллиона параметров и 5000 примеров ... что бы вы ожидали? Конечно, количество параметров не является хорошим индикатором пропускной способности нейронной сети (это неидентифицируемая модель), но все же ... Я не думаю, что вы можете добиться гораздо большего, чем это, но вы можете попробовать несколько вещей:

  • нормализуйте все входы (например, измените интенсивность RGB каждого пикселя между -1 и 1 или используйте стандартизацию) и все выходы. Это особенно поможет, если у вас есть проблемы сходимости.
  • перейдите в оттенки серого: это уменьшит ваши входные каналы с 3 до 1. Все ваши изображения кажутся (на мой неопытный взгляд) относительно похожими цветами. Вы уверены, что это цвет, который необходим для предсказания , а не наличие более темных или светлых областей? Может быть, вы уверены (я не эксперт): в этом случае пропустите это предложение.y
  • Данные дополнения: так как вы сказали , что листать, вращение на произвольный угол или зеркалирование ваши изображения должны привести к одной и той же продукции, вы можете увеличить размер набора данных много . Обратите внимание, что при увеличении набора данных ошибка в обучающем наборе возрастет: здесь мы ищем меньший разрыв между потерей обучающего набора и потерей тестового набора. Кроме того, если потеря тренировочного набора значительно увеличивается, это может быть хорошей новостью: это может означать, что вы можете тренировать более глубокую сеть на этом большом тренировочном наборе без риска переоснащения. Попробуйте добавить больше слоев и посмотрите, получите ли вы теперь меньший тренировочный набор и потерю тестового набора. Наконец, вы можете попробовать и другие приемы расширения данных, которые я цитировал выше, если они имеют смысл в контексте вашего приложения.
  • используйте трюк «классификация-затем-регрессия»: первая сеть только определяет, должен ли быть один из, скажем, 10 бинов, например, и т. д. Затем вторая сеть вычисляет : здесь также могут помочь центрирование и нормализация. Не могу сказать, не пытаясь.y[80,97],[97,124][0,27]
  • Попробуйте использовать современную архитектуру (Inception или ResNet) вместо винтажной. ResNet на самом деле имеет меньше параметров, чем VGG-Net. Конечно, вы хотите использовать небольшие ResNet здесь - я не думаю, что ResNet-101 может помочь с набором данных 5000 изображений. Вы можете значительно увеличить набор данных, хотя ....
  • Поскольку ваши выходные данные инвариантны к вращению, другой замечательной идеей будет использование либо групповых эквивариантных CNN , выходные данные которых (при использовании в качестве классификаторов) инвариантны к дискретным поворотам, либо управляемых CNNчей вывод инвариантен к непрерывным вращениям. Свойство инвариантности позволит вам получить хорошие результаты с гораздо меньшим увеличением объема данных или, в идеале, вообще без него (для вращений: конечно, вам все еще нужны другие типы данных). Групповые эквивариантные CNN являются более зрелыми, чем управляемые CNN с точки зрения реализации, поэтому сначала я бы попробовал групповые CNN. Вы можете попробовать классификацию-затем-регрессию, используя G-CNN для классификационной части, или вы можете поэкспериментировать с подходом чистой регрессии. Не забудьте изменить верхний слой соответственно.
  • поэкспериментируйте с размером партии (да, да, я знаю, что взлом гиперпараметров - это не круто, но это лучшее, что я могу получить в ограниченные сроки и бесплатно :-)
  • наконец, существуют архитектуры, которые были специально разработаны для точных прогнозов с небольшими наборами данных. Большинство из них использовали расширенные свертки : один известный пример - плотная сверточная нейронная сеть смешанного масштаба . Однако реализация не является тривиальной.
DeltaIV
источник
3
Спасибо за подробный ответ. Я уже делал существенное увеличение данных. Пробовал пару вариантов начальной модели (где вариация означает, что количество фильтров масштабируется одинаково по всей модели). Видел невероятные улучшения. Все еще есть способы пойти. Я попробую несколько ваших предложений. Еще раз спасибо.
Родриго-Сильвейра
@ rodrigo-silveira, пожалуйста, дайте мне знать, как это происходит. Может быть, мы сможем поговорить в чате, когда у вас будут результаты.
DeltaIV
1
Отличный ответ, заслуживает большего ^
Джилли
1
Очень хорошо сочинено!
Картик Тиагараджан
1
Я бы дал вам 10 тысяч баллов за это, если бы мог. Удивительный ответ
Boppity Bop