от ковариационной матрицы до отбеливания изображения

1656538148 ot kovariaczionnoj matriczy do otbelivaniya izobrazheniya

от hadrienj

Целью этой публикации является переход от основ предварительной обработки данных к современным методам, используемым в глубоком обучении. Я хочу сказать, что мы можем использовать код (например Python/NumPy), чтобы лучше понять абстрактные математические понятия. Мышление с помощью кодировки! ?

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

Предварительная обработка относится ко всем преобразованиям необработанных данных до того, как они будут представлены в алгоритме машинного обучения или глубокого обучения. Например, обучение сверточной нейронной сети на необработанных изображениях, вероятно, приведет к плохой эффективности классификации (Pal & Sudeep, 2016). Предварительная обработка также важна для ускорения обучения (например, техники центрирования и масштабирования, см. Lecun et al., 2012; см. 4.3).

Вот программа этого урока:

1. Справочная информация: В первой части мы получим некоторые упоминания о дисперсии и ковариации. Мы увидим, как генерировать и планировать поддельные данные, чтобы лучше понять эти понятия.

2. Предварительная обработка: Во второй части мы увидим основы некоторых методов предварительной обработки, которые можно применить к любому типу данных. означает нормализацию, стандартизацияи отбеливание.

3. Отбеливающие изображения: В третьей части мы воспользуемся инструментами и понятиями, полученными 1. и 2. сделать особый вид отбеливания, что называется Анализ нулевых компонентов (ZCA). Его можно использовать для предварительной обработки изображений для глубокого обучения. Эта часть будет очень практичной и веселой!

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

1. Фон

A. Дисперсия и ковариация

Дисперсия переменной обрисовывает, как распространены значения. Ковариация – это мера, определяющая величину зависимости между двумя переменными.

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

Значение ковариации зависит от масштаба переменной, поэтому его сложно проанализировать. Можно использовать коэффициент корреляции, который легче интерпретировать. Коэффициент корреляции – это просто нормированная ковариация.

1*GH0ou22oJEwAw89GkrS8-w
Положительная ковариация означает, что большие значения одной переменной связаны с большими значениями другой (слева). Отрицательная ковариация означает, что большие значения одной переменной связаны с малыми значениями другой (справа).

Ковариационная матрица – это матрица, суммирующая дисперсии и ковариации набора векторов, и она может рассказать многое о ваших переменных. Диагональ соответствует дисперсии каждого вектора:

1*5V2y7dyc7YclTRqdVjoOrQ
Матрица А и его матрица ковариации Диагональ соответствует дисперсии каждого вектора столбца.

Давайте просто проверим по формуле дисперсии:

1*EpBVFBmFboZeAxANYe6PEg

с п длина вектора, и среднего вектора. Например, дисперсия вектора первого столбца А есть:

1*nIpi1287Raa-n9NKwVHrsA

Это первая ячейка нашей ковариационной матрицы. Второй элемент на диагонали соответствует дисперсии вектора второго столбца от А и так дальше.

Примечание: векторы, выделенные из матрицы. А отвечают столбцам А.

Другие ячейки соответствуют ковариации между двумя векторами столбцов из А. Например, ковариация между первым и третьим столбцами расположена в ковариационной матрице как столбец 1 и строка 3 (или столбец 3 и строка 1).

1*Ce3wTRBXCJUG7fFf95CQ9Q
Позиция в ковариационной матрице. Столбец соответствует первой переменной, а строка – второй (или наоборот). Ковариация между первым и третьим вектором столбцов А является элементом в столбце 1 и строке 3 (или наоборот = то же значение).

Давайте проверим, что ковариация между первым и третьим вектором столбцов А равна -2,67. Формула ковариации между двумя переменными X и Ю есть:

1*Y1kVDzXPCxhRRsk8snmzTQ

Переменные X и Ю – это первый и третий векторы столбцов в последнем примере. Давайте разделим эту формулу, чтобы убедиться, что она кристально поняла:

1*BWZDmC8GrNL-xNqGG1CjyA
  1. Символ суммы (Σ) означает, что мы будем повторять элементы векторов. Начнем с первого элемента (i=1) и вычислите первый элемент X минус среднего вектора X.
1*aFL3dzKMDXf9vj2_J5tNPQ

2. Умножьте результат на первый элемент Ю минус среднего вектора Ю.

1*AKo4naYravnW3-3NrwSXTg

3. Повторите процесс каждого элемента векторов и вычислите сумму всех результатов.

1*lk6JZa0lHqswjKwD5wKziQ

4. Делим на количество элементов в векторе.

Пример 1.

Начнём с матрицы А:

1*o6NqwIfr6XlHSL_NIXtXsA

Мы вычислим ковариацию между первым и третьим векторами столбцов:

1*BvbRAxHeb40LU5goEDsoLg

и

1*Jx4vbnRDKW95fF2nYSygZg

x̄=3, ȳ=4и n=3 то мы имеем:

1*PcvOUuCgOCY_qQhLb5AimA

ОК здорово! Это значение ковариационной матрицы.

Теперь простой путь. С помощью NumPy ковариационную матрицу можно вычислить с помощью функции np.cov.

Стоит отметить что если вы хотите, чтобы NumPy использовал столбцы как векторы, параметр rowvar=False необходимо использовать. также, bias=True делится на п а не путем п-1.

Давайте сначала создадим массив:

array([[1, 3, 5],       [5, 4, 1],       [3, 8, 6]])

Теперь вычислим ковариацию с помощью функции NumPy:

array([[ 2.66666667, 0.66666667, -2.66666667],       [ 0.66666667, 4.66666667, 2.33333333],       [-2.66666667, 2.33333333, 4.66666667]])

Выглядит отлично!

Нахождение ковариационной матрицы по произведению

Существует другой способ вычисления ковариационной матрицы А. Можно центрировать А вокруг 0. Среднее значение вектора вычитается из каждого элемента вектора, чтобы получить вектор со средним, равным 0. Оно умножается на собственное транспонирование и делится на количество наблюдений.

Давайте начнем с реализации, а затем попытаемся понять связь с предыдущим уравнением:

Проверим это на нашей матрице А:

array([[ 2.66666667, 0.66666667, -2.66666667],       [ 0.66666667, 4.66666667, 2.33333333],       [-2.66666667, 2.33333333, 4.66666667]])

Мы получаем тот же результат, что и раньше.

Объяснение простое. Произведение между двумя векторами можно выразить:

1*hdHYlHiK3s0IDwwWytJO0A

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

1*6zDuuYJtL6yiuE1CatrYDQ
Произведение соответствует сумме произведений каждого элемента векторов.

Если п это количество элементов в наших векторах, на которые мы делим п:

1*XNMJtFhQF2v56K1OLE0_Yw

Можно отметить, что это не очень далеко от формулы ковариации, которую мы видели раньше:

1*RYVpFx0lrkTEl_R92ocGgQ

Единственное отличие состоит в том, что в формуле ковариации мы вычитаем среднее вектор из каждого его элемента. Вот почему нам нужно центрировать данные, прежде чем производить точечное произведение.

Теперь, если у нас есть матрица Аточечное произведение между А и его транспонирование даст вам новую матрицу:

1*1Qw42RtGhHQWXD4rkA-MTQ
Если вы начинаете с матрицы с нулевым центром, точечное произведение между этой матрицей и ее транспонированием даст вам дисперсию каждого вектора и ковариацию между ними, то есть ковариационную матрицу.

Это ковариационная матрица!

B. Визуализация данных и ковариационных матриц

Чтобы получить больше представлений о ковариационной матрице и как она может быть полезна, мы создадим функцию для ее визуализации вместе с 2D-данными. Вы сможете увидеть связь между ковариационной матрицей и данными.

Эта функция вычислит ковариационную матрицу, как мы видели выше. Он создаст два подграфика – один для ковариационной матрицы, а второй для данных. The heatmap() функция от Seaborn используется для создания градиентов цвета – малые значения будут окрашены в светло-зеленый, а большие значения в темно-синий. Мы выбрали один из цветов нашей палитры, но вы можете предпочесть другие цвета. Данные представлены в виде диаграммы рассеяния.

C. Данные моделирования

Некоррелированные данные

Теперь, когда у нас есть функция диаграммы, мы сгенерируем некоторые случайные данные, чтобы вообразить, что может рассказать нам ковариационная матрица. Мы начнем с некоторых данных, полученных с нормального распределения с помощью функции NumPy np.random.normal().

1*C5wwjainirV9mQHDlei9SQ
Рисование образца из нормального распределения с помощью NumPy.

Эта функция требует среднего значения, стандартного отклонения и количества наблюдений распределения как входных данных. Мы создадим две случайные величины из 300 наблюдений со стандартным отклонением 1. Первая будет средней 1, а вторая – средней 2. Если мы случайным образом вытащим два набора по 300 наблюдений из нормального распределения, оба вектора будут некоррелированы.

(300, 2)

Примечание 1: Мы транспонируем данные с помощью .T поскольку оригинальная форма есть (2, 300) и мы хотим, чтобы количество наблюдений в виде строк (так с формой (300, 2)).

Примечание 2: Мы используем np.random.seed функция воспроизводимости. То же случайное число будет использовано при следующем запуске ячейки.

Давайте проверим, как выглядят данные:

array([[ 2.47143516, 1.52704645],       [ 0.80902431, 1.7111124 ],       [ 3.43270697, 0.78245452],       [ 1.6873481 , 3.63779121],       [ 1.27941127, -0.74213763],       [ 2.88716294, 0.90556519],       [ 2.85958841, 2.43118375],       [ 1.3634765 , 1.59275845],       [ 2.01569637, 1.1702969 ],       [-0.24268495, -0.75170595]])

Прекрасно, у нас есть два вектора-столбца.

Теперь мы можем проверить, нормальные распределения:

1*Wb8r7PRje6nunmN-iMrUyQ

Выглядит отлично!

Мы видим, что распределения имеют эквивалентные стандартные отклонения, но разные средние значения (1 и 2). Это именно то, о чем мы просили.

Теперь мы можем построить наш набор данных и его ковариационную матрицу с помощью нашей функции:

Covariance matrix:[[ 0.95171641 -0.0447816 ] [-0.0447816 0.87959853]]
1*Kq4mIBv4hFGzOuhoftcFVQ

На диаграмме рассеяния мы видим, что два измерения не коррелированы. Обратите внимание, что мы имеем одно измерение со средним значением 1 (ось y), а другое со средним значением 2 (ось x).

Кроме того, ковариационная матрица показывает, что дисперсия каждой переменной очень велика (около 1), а ковариация столбцов 1 и 2 очень мала (около 0). Поскольку мы убедились, что два вектора независимы, это когерентно. Обратное не обязательно верно: ковариация 0 не гарантирует независимости (см. здесь).

Коррелированные данные

Теперь давайте построим зависимые данные, указав один столбец из другого.

Covariance matrix:[[ 0.95171641 0.92932561] [ 0.92932561 1.12683445]]
1*r-OmoGkWJvkWqjFO0ltV3w

Соотношение между двумя измерениями видно на диаграмме рассеяния. Мы видим, что линию можно нарисовать и использовать для прогнозирования y от x и наоборот. Ковариационная матрица не диагональна (за пределами диагонали есть ненулевые клетки). Это означает, что ковариация между измерениями отлична от нуля.

Это восхитительно! Теперь у нас есть все инструменты, чтобы увидеть различные методы предварительной обработки.

2. Предварительная обработка

A. Средняя нормализация

Нормализация среднего значения – просто удаление среднего значения из каждого наблюдения.

1*ym0P7PyUgZlML1QlGeUlvQ

где X’ является нормализованным набором данных, X является исходным набором данных и является средним X.

Средняя нормализация имеет эффект центровки данных вокруг 0. Мы создадим функцию center() чтобы сделать это:

Давайте попробуем с матрицей Б мы создали раньше:

Before:
Covariance matrix:[[ 0.95171641 0.92932561] [ 0.92932561 1.12683445]]
1*PaAR5buk8ICGSyiTKAeh_w
After:
Covariance matrix:[[ 0.95171641 0.92932561] [ 0.92932561 1.12683445]]
1*QeCA2GooKYzbVqevDVG0FA

Первый график снова показывает исходные данные Б второй график показывает центрированные данные (посмотрите на масштаб).

B. Стандартизация или нормализация

Стандартизация используется для помещения всех признаков в одну шкалу. Каждое измерение с нулевым центром делится на его стандартное отклонение.

1*2PX6slhDPJkjibJiecX25Q

где X’ это стандартизированный набор данных, X это исходный набор данных, является средним X, и σ является стандартным отклонением X.

Давайте создадим другой набор данных с другим масштабом, чтобы проверить, работает ли он.

Covariance matrix:[[ 0.95171641 0.83976242] [ 0.83976242 6.22529922]]
1*vTAyUBAcepxHyvX449hESQ

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

Covariance matrix:[[ 1.          0.34500274] [ 0.34500274  1.        ]]
1*0a6gXhWnLPBv8i-L7PbYKA

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

Теперь посмотрите на ковариационную матрицу. Вы можете увидеть, что дисперсия каждой координаты – верхней левой ячейки и нижней правой ячейки – равна 1.

Эта новая ковариационная матрица действительно является матрицей корреляции. Коэффициент корреляции Пирсона между двумя переменными (c1 и c2) составляет 0,54220151.

C. Отбеливание

Отбеливание данных означает, что мы хотим преобразовать их, чтобы иметь ковариационную матрицу, идентичную матрице — 1 по диагонали и 0 для других ячеек. Это называется отбеливанием относительно белого шума.

Вот подробнее о матрице идентичности.

Отбеливание немного сложнее, чем другая предварительная обработка, но теперь у нас есть все инструменты, необходимые для этого. Он включает в себя следующие шаги:

  • Нулевой центр данных
  • Украсьте данные
  • Изменить масштаб данных

Берем еще раз C и попытайтесь выполнить эти действия.

  1. Нулевая центровка

Это относится к средней нормализации (2. А). Проверьте еще раз, чтобы узнать больше о center() функция.

Covariance matrix:[[ 0.95171641  0.83976242] [ 0.83976242  6.22529922]]
1*AXOzdgC8gjiwpg-9AsfzKw

2. Декорелировать

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

1*ehXogigFyLpyy2q2sz80HA

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

Теперь возьмите все точки данных и поверните их (возможно, примерно на 45 градусов против часовой стрелки. Новые данные, нанесенные справа, больше не коррелируют. Вы можете увидеть, что большие и маленькие y ценности связаны с одним и тем же типом x ценности.

Возникает вопрос: как мы можем найти правильное вращение для получения некоррелированных данных?

Собственно, это именно то, что производят собственные векторы ковариационной матрицы. Они указывают направление, где распространение данных максимальное:

1*1SAoJ_o70IygSmDnKiCkmw

Собственные векторы ковариационной матрицы дают вам направление, которое максимизирует дисперсию. Направление зеленый линия – это место, где дисперсия максимальна. Просто посмотрите на самую маленькую и самую точку, спроектированную на этой линии – разброс большой. Сравните это с проекцией на оранжевый линия – разброс очень мал.

Чтобы узнать больше о собственном разложении, смотрите эту публикацию.

Таким образом, мы можем декорировать данные, проецируя их с помощью собственных векторов. Это приведет к применению требуемого поворота и удаления корреляции между размерами. Вот шаги:

Давайте попробуем украсить нашу матрицу с нулевым центром C чтобы увидеть это в действии:

Covariance matrix:[[ 0.95171641 0.83976242] [ 0.83976242 6.22529922]]
1*Ok5JSx7zN4lg9FAcZOE6Ew
Covariance matrix:[[ 5.96126981e-01 -1.48029737e-16] [ -1.48029737e-16 3.15205774e+00]]
1*HmJGGe0cP6X-p0W-VuRfBg

Хорошо! Это работает.

Мы видим, что корреляции уже нет. Ковариационная матрица, ныне диагональная матрица, подтверждает, что ковариация между двумя измерениями равна 0.

3. Измените масштаб данных

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

Примечание: мы добавляем небольшое значение (здесь 10^-5), чтобы избежать разделения на 0.

Covariance matrix:[[ 9.99983225e-01 -1.06581410e-16] [ -1.06581410e-16 9.99996827e-01]]
1*vFleYrVKknN5zwO3SNA5hQ

Ура! Мы видим, что с ковариационной матрицей все это хорошо. У нас есть что-то похожее на идентичную матрицу – 1 по диагонали и 0 в другом месте.

3. Отбеливание изображения

Мы увидим, как можно использовать отбеливание для предварительной обработки набора данных изображения. Для этого мы воспользуемся статьей Pal & Sudeep (2016), где они дают некоторые подробности процесса. Этот метод предварительной обработки называется анализом нулевых компонентов (ZCA).

Просмотрите бумагу, но вот такой результат они получили. Показаны оригинальные изображения (слева) и изображения после ZCA (справа).

1*YyKLLSzcAMX_9cCBbjP2sg
Отбеливающее изображение из набора данных CIFAR10. Результаты работы Pal&Sudeep (2016).

В первую очередь. Мы загрузим изображения из набора данных CIFAR. Этот набор данных доступен в Keras, и вы можете скачать его здесь.

(50000, 32, 32, 3)

Учебный набор данных CIFAR10 содержит 50000 изображений. Форма X_train есть (50000, 32, 32, 3). Каждое изображение имеет размеры 32х32 пикселя, и каждый пиксель содержит 3 замера (R, G, B). Каждое значение представляет собой яркость соответствующего цвета от 0 до 255.

Мы начнем с выбора только подмножества изображений, скажем, 1000:

(1000, 32, 32, 3)

Так лучше. Теперь мы изменим форму массива, чтобы иметь данные плоского изображения с одним изображением в строке. Каждое изображение будет (1, 3072) потому что 32 x 32 x 3 = 3072. Таким образом, массив, содержащий все изображения, будет (1000, 3072):

(1000, 3072)

Следующим шагом является возможность увидеть изображение. Функция imshow() с Matplotlib (doc) можно использовать для отображения изображений. Для этого нужны изображения с формой (M x N x 3), поэтому давайте создадим функцию для изменения формы изображений и сможем визуализировать их из формы (1, 3072).

Например, давайте изобразим одно из загруженных изображений:

1*ylvIdrsU1GyVkJwP6cwTdA

мыло!

Теперь мы можем реализовать отбеливание изображений. Пал и Судип (2016) описывают процесс:

1. Первый шаг — изменение масштаба изображения для получения диапазона. [0, 1] путём деления на 255 (максимальное значение пикселей).

Напомним, что формула для получения диапазона [0, 1] есть:

1*g8aDx7zkR7G4GoZzLJONhA

но здесь минимальное значение равно 0, поэтому это приводит к:

1*QSSqNJa6rbJGOEQMk_Jp0A
X.min() 0.0X.max() 1.0

Средние вычитания: на пиксель или изображение?

Хорошо, диапазон наших значений пикселей сейчас составляет от 0 до 1. Следующий шаг:

2. Вычтите среднее из всех изображений.

Будьте осторожны здесь.

Один из способов сделать это – взять каждое изображение и удалить среднее значение этого изображения из каждого пикселя (Jarrett et al., 2009). Интуиция этого процесса состоит в том, что он центрирует пиксели каждого изображения вокруг 0.

Другой способ сделать это — взять каждый из 3072 пикселей (32 на 32 пикселя для R, G и B) для каждого изображения и отнять среднее значение этого пикселя для всех изображений. Это называется вычитанием среднего за пиксель. В этот раз каждый пиксель будет центрироваться вокруг. согласно всем изображениям. При наполнении сети изображениями каждый пиксель рассматривается как другая функция. С помощью средней вычитки на пиксель мы центрировали каждый признак (пиксель) вокруг 0. Эта техника обычно используется (например, Wan et al., 2013).

Теперь мы выполним вычитание среднего за пиксель из наших 1000 изображений. Наши данные организованы по этим параметрам (images, pixels). Это было (1000, 3072) потому что есть 1000 изображений с 32 x 32 x 3 = 3072 пикселей. Таким образом, среднее значение на пиксель можно получить с первой оси:

(3072,)

Это дает нам 3072 значения, являющиеся количеством средних — по одному на пиксель. Давайте посмотрим, какие ценности у нас есть:

array([ 0.5234 , 0.54323137, 0.5274 , …, 0.50369804, 0.50011765, 0.45227451])

Это около 0,5, потому что мы уже нормализовались в диапазоне [0, 1]. Однако нам все равно нужно удалить среднее из каждого пикселя:

Чтобы убедиться, что это сработало, мы вычислим среднее значение первого пикселя. Будем надеяться, что это 0.

array([ -5.30575583e-16, -5.98021632e-16, -4.23439062e-16, …, -1.81965554e-16, -2.49800181e-16, 3.98570066e-17])

Это не совсем 0, но достаточно мало, чтобы мы могли считать, что это сработало!

Теперь мы хотим вычислить ковариационную матрицу данных с нулевым центром. Как мы видели выше, мы можем вычислить его с помощью np.cov() функция из NumPy.

Пожалуйста, запиши что наши переменные – это наши разные образы. Это означает, что переменные являются строками матрицы. X. Чтобы было ясно, мы сообщим эту информацию NumPy с параметром rowvar=TRUE даже если это так True по умолчанию (см. документ):

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

Примечание: Это может занять немного времени с большим количеством изображений, и поэтому мы используем всего 1000 изображений. В статье они использовали 10 000 изображений. Не стесняйтесь сравнивать результаты в соответствии с количеством изображений, которые вы используете:

В работе они использовали следующее уравнение:

1*ucN3UJIcEWsuYu1EZjA3KA

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

Мы попытаемся реализовать это уравнение. Начнем с проверки размеров СИД:

(1000, 1000) (1000,)

С это вектор, содержащий 1000 элементов (единичные значения). diag(S) таким образом будет иметь форму (1000, 1000) с С как диагональ:

[[ 8.15846654e+00 0.00000000e+00 0.00000000e+00 …, 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 4.68234845e+00 0.00000000e+00 …, 0.00000000e+00 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 2.41075267e+00 …, 0.00000000e+00 0.00000000e+00 0.00000000e+00] …,  [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 …, 3.92727365e-05 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 …, 0.00000000e+00 3.52614473e-05 0.00000000e+00] [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 …, 0.00000000e+00 0.00000000e+00 1.35907202e-15]]
shape: (1000, 1000)

Проверьте эту часть:

1*l5DfX7eqQvIgndc4B749Gg

Это также имеет форму (1000, 1000) так хорошо как В и U^T. Мы тоже это видели X имеет форму (1000, 3072). Форма X_ZCA является следующим образом:

1*2aSZTPJiOgdApva29IZyUg

что соответствует форме исходного набора данных. хорошо.

Мы имеем:

1*TdmO3dBq-ne84RqY-EtZ2Q
1*mEVlWSSed1Ne_eQ7UiqrZQ

Разочаровывает! Если вы посмотрите на бумагу, это не тот результат, который они показывают. На самом деле это потому, что мы не изменили масштаб пикселей и есть отрицательные значения. Для этого мы можем вернуть его в диапазон [0, 1] по той же технике, что и выше:

min: 0.0max: 1.0
1*ylvIdrsU1GyVkJwP6cwTdA
1*7Cd3O07GnABlmvfGflJDqg

Ура! Это восхитительно! Это выглядит как изображение из бумаги. Как уже упоминалось ранее, они использовали 10000 изображений, а не 1000, как мы.

Чтобы увидеть различия в результатах в соответствии с количеством используемых изображений и эффектом гиперпараметра ϵвот результаты для разных значений:

1*ZN5tPhzho7QCbL4VCXYKGQ

Результат отбеливания зависит от количества используемых изображений и значения гиперпараметра. ϵ. Изображение слева представляет собой оригинальное изображение. В своей работе Pal&Sudeep (2016) использовали 10 000 изображений и epsilon = 0,1. Это соответствует нижнему левому изображению.

Это все!

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

Вы также можете разделить блокнот Jupyter на Github здесь.

Ссылки

К. Джарретт, К. Кавуккуоглу, М. Ранзато и Ю. Лекун, «Какая лучшая многоступенчатая архитектура для распознавания объектов?», 2009 IEEE 12th International Conference on Computer Vision, 2009, с. 2146–2153.

А. Крыжевский, «Изучение нескольких слоев признаков по крошечным изображениям», магистерская работа, Университет Тронта, 2009.

YA LeCun, L. Bottou, GB Orr и K.-R. Мюллер, «Efficient BackProp», в Neural Networks: Tricks of the Trade, Springer, Berlin, Heidelberg, 2012, с. 9–48.

К. К. Пал и К. С. Судип, «Предварительная обработка для классификации изображений сверточными нейронными сетями», на Международной конференции IEEE 2016 года по последним тенденциям в области электроники, информационно-коммуникационных технологий (RTEICT), 2016, с. 1778–1781.

Л. Ван, М. Цайлер, С. Чжан, Ю. Л. Кун и Р. Фергус, «Регуляризация нейронных сетей с помощью DropConnect», Международная конференция по машинному обучению, 2013 г., с. 1058-1066.

Большие ресурсы и QA

Википедия — Отбеливающая трансформация

CS231 — Сверточные нейронные сети для визуального распознавания

Дастин Стенсбери — Умная машина

Некоторые детали о ковариационной матрице

SO — отбеливание изображения в Python.

Средняя нормализация для изображения или всего набора данных

Вычитание среднего значения – все изображения или одно изображение?

Почему центровка важна — см. рис. раздел 4.3

Ядро Kaggle на ZCA

Как ZCA реализовано в Keras

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *