Я работал над проблемой регрессии, когда входной сигнал представляет собой изображение, а метка представляет собой непрерывное значение между 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
Я реструктурировал свой вопрос так, надеюсь, понятно, что я после
источник
Ответы:
Прежде всего, общее предложение: выполните поиск литературы, прежде чем начинать эксперименты по теме, с которой вы не знакомы. Вы сэкономите много времени.
В этом случае, глядя на существующие документы, вы могли заметить, что
Регрессия с CNN не является тривиальной проблемой. Посмотрев снова на первый документ, вы увидите, что у них есть проблема, когда они могут генерировать бесконечные данные. Их цель - предсказать угол поворота, необходимый для выпрямления 2D-изображений. Это означает, что я могу в основном взять свой тренировочный набор и увеличить его, поворачивая каждое изображение на произвольные углы, и я получу действительный, больший тренировочный набор. Таким образом, проблема кажется относительно простой с точки зрения проблем глубокого обучения. Кстати, обратите внимание на другие приемы увеличения данных, которые они используют:
Я недостаточно хорошо знаю вашу проблему, чтобы сказать, имеет ли смысл учитывать изменения положения, яркости и гамма-шума для ваших фотографий, тщательно снятых в лаборатории. Но вы всегда можете попробовать и удалить его, если это не улучшит потерю тестового набора. На самом деле, вы должны действительно использовать набор проверки или перекрестную проверку -кратности для такого рода экспериментов, и не смотрите на набор тестов, пока не определите свою настройку, если вы хотите, чтобы потеря набора тестов была репрезентативной для ошибка обобщения.k−
В любом случае, даже в идеальных условиях наивный подход не сработал так хорошо (раздел 4.2 ). Они удалили выходной слой (слой softmax) и заменили его слоем с двумя единицами, которые предсказывали бы синус и косинус угла поворота. Фактический угол будет вычисляться как . Нейронная сеть также прошла предварительную подготовку в ImageNet (это называется трансферным обучением).y x α=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,
где - это размер вашего тренировочного набора (таким образом, ), - это выход вашего CNN для image а - соответствующая концентрация химического вещества? Начиная с , если предположить, что вы прогнозы вашего CNN между 80 и 350 (или просто используете логит, чтобы подогнать их под этот интервал), вы получаете ошибку менее . Серьезно, что вы ожидаете? это не кажется мне большой ошибкой вообще.N N<5000 h(xi) xi yi yi∈[80,350] 0.12%
Кроме того, просто попробуйте вычислить количество параметров в вашей сети: я спешу и, возможно, я делаю глупые ошибки, поэтому непременно проверяйте мои вычисления с какой-либо
summary
функцией из любой используемой вами среды. Тем не менее, примерно я бы сказал, что у вас есть(обратите внимание, что я пропустил параметры слоев пакетной нормы, но это всего лишь 4 параметра для слоя, поэтому они не имеют значения). У вас есть полмиллиона параметров и 5000 примеров ... что бы вы ожидали? Конечно, количество параметров не является хорошим индикатором пропускной способности нейронной сети (это неидентифицируемая модель), но все же ... Я не думаю, что вы можете добиться гораздо большего, чем это, но вы можете попробовать несколько вещей:
источник