Зачем нормализовывать изображения, вычитая среднее значение изображения набора данных вместо текущего среднего значения изображения в глубоком обучении?


88

Существуют некоторые варианты нормализации изображений, но большинство, похоже, используют эти два метода:

  1. Вычтите среднее значение для канала, рассчитанное для всех изображений (например, VGG_ILSVRC_16_layers )
  2. Вычесть по пикселю / каналу, рассчитанному по всем изображениям (например, CNN_S , также см. Эталонную сеть Caffe )

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

В 3.3.3 Пьер Серманет ссылается на локальную нормализацию контраста , которая будет основана на каждом изображении, но я не сталкивался с этим ни в одном из примеров / учебных пособий, которые я видел. Я также видел интересный вопрос Quora и пост Сюй-Шэнь Вэя, но они, кажется, не поддерживают два вышеупомянутых подхода.

Что именно мне не хватает? Это проблема нормализации цвета или есть документ, который на самом деле объясняет, почему так много людей используют этот подход?


Я не знаю ответа, но вы пробовали каждый метод? Есть ли какая-то разница в их выступлениях?
user112758

@ user112758 - их реализация немного болезненна (особенно для попикселя), и мой опыт показывает, что нормализация для каждого изображения работает нормально, но мои данные не настолько репрезентативны. Я попытаюсь поэкспериментировать с нормализацией, но мне любопытно услышать мотивы этих (на мой взгляд) странных процедур нормализации.
Макс Гордон

Хорошо, возможно, вы можете спросить об этом в вопросах GitHub. Я думаю, что было бы больше экспертов по этой теме.
user112758

Ответы:


58

Вычитание среднего значения набора данных служит для «центрирования» данных. Кроме того, в идеале вы хотели бы разделить на sttdev этого объекта или пикселя, если вы хотите нормализовать каждое значение объекта по z-значению.

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

В этом процессе мы хотели бы, чтобы каждая функция имела одинаковый диапазон, чтобы наши градиенты не выходили из-под контроля (и чтобы нам был нужен только один глобальный множитель скорости обучения).

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

В некоторых моделях CNN вы увидите, что для каждого изображения используется отбеливание, которое больше соответствует вашим взглядам.


4
Спасибо за ответ. Я знаком с концепцией центрирования данных и обеспечения того, чтобы диапазон был одинаковым для получения стабильных градиентов. Вопрос в том, почему мы должны делать это по всему набору данных и почему это поможет в отличие от отбеливания для каждого изображения? Я хотел бы получить простую ссылку, которая каким-то образом показывает, что это улучшает обучение, прежде чем я приму ответ. Я знаю, что пакетная нормализация является невероятно мощной техникой, но я не вижу связи с нормализацией всего набора данных.
Макс Гордон

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

Я думал, что партии также являются основой для стохастического градиентного спуска. Даже если бы я мог поместить все в память, я хочу обновлять параметры чаще, чем после каждой эпохи.
Макс Гордон

3
Они есть. И вы можете обновлять так часто, как вы хотите - аналитические значения идентичны, что так хорошо и масштабируемо для градиентного спуска. Причина, по которой мы используем стохастический градиентный спуск ( случайный порядок ввода + пакетирование), заключается в том, чтобы сгладить наше восхождение на гору через градиентное пространство. Учитывая одну точку, мы не можем быть уверены, что наше обновление подтолкнет нас в направлении локальных максимумов, однако, если вы выберете достаточное количество точек, эта вероятность станет выше (в ожидании).
Lollercoaster

2
Как это помогает получить функции в аналогичном диапазоне? Если у меня есть два изображения, одно в диапазоне от 0 до 255 и одно в диапазоне от 0 до 50 в значениях пикселей, скажем, со средним значением 50 и стандартным значением 15, нормализация дает мне изображение 1 в диапазоне от -3,3 до 13,6 и изображение 2 в пределах От -3,3 до 0. Они все еще не в том же масштабе.
Даниил

9

Перед нормализацией партии среднее вычитание на канал использовалось для центрирования данных вокруг нулевого среднего для каждого канала (R, G, B). Это обычно помогает сети учиться быстрее, поскольку градиенты действуют одинаково для каждого канала. Я подозреваю, что если вы используете нормализацию партии, то шаг предварительной обработки среднего вычитания для каждого канала на самом деле не нужен, так как в любом случае вы нормализуете для каждой мини-партии.


1
«Я подозреваю, что если вы используете нормализацию партии, шаг предварительной обработки среднего вычитания для каждого канала на самом деле не является необходимым, так как вы все равно нормализуетесь для каждой мини-партии» Но пакетная норма относится к нормализации весов в слоях вашей сети ... а не к фактическим входным изображениям. Это 2 разные вещи.
Моника Хедднек

4

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


4

Это называется предварительной обработкой данных перед их использованием. Вы можете обрабатывать разными способами, но есть одно условие, что вы должны обрабатывать все данные с одной и той же функцией X_preproc = f (X), и это f (.) Не должно зависеть от самих данных, поэтому, если вы используете текущее изображение, значит обрабатывать это текущее изображение, тогда ваш f (X) будет действительно f (X, изображение), и вы этого не хотите.

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

Но f (.) Выше поможет в оптимизации, сохранив все функции численно равными друг другу (конечно, приблизительно)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.