Классификация ImageNet с глубокими сверточными нейронными сетями

Авторы: Алекс Крижевский, Илья Суцкевер, Джеффри Хинтон.

Это реализация этой бумаги.

блокнот ipython здесь

Это было одно из самых влиятельных изданий в области компьютерного зрения. Эта модель выиграла конкурс ILSVRC 2012.

1. Обучил сеть по данным ImageNet, которые содержат более 15 миллионов изображений из более чем 22 000 категорий.

2. В этой статье используется функция активации ReLU для нелинейности. Было обнаружено, что ReLU сокращает время выполнения обучения, так как он работает быстрее, чем обычная функция tanh.

3. Выпадение было реализовано, чтобы уменьшить эффект переобучения.

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

5. В качестве оптимизатора использовался стохастический градиентный спуск с затуханием импульса и веса.

6. Эта модель обучалась на графических процессорах GTX 580 в течение 6 дней.

Набор данных

Imagenet - это набор данных из более чем 15 миллионов изображений, принадлежащих примерно к 22 000 категориям. Изображения были собраны из Интернета и помечены специалистами по разметке с помощью краудсорсингового инструмента Amazon Mechanical Turk. Начиная с 2010 года, в рамках Pascal Visual Object Challenge проводится ежегодный конкурс ImageNet Large-Scale Visual Recognition Challenge (ILSVRC). ILSVRC использует подмножество ImageNet с примерно 1000 изображений в каждой из 1000 категорий. Всего существует примерно 1,2 миллиона обучающих изображений, 50 000 изображений для проверки и 150 000 изображений для тестирования.

Из-за вычислительных причин мы будем использовать набор данных CIFAR-10 в этой бумажной реализации.

ReLU Нелинейность

Стандартным способом реализации выходного сигнала нейрона до этой статьи была активация tanh.

Было замечено, что время обучения функции активации tanh было больше, чем время активации ReLU на этапе обратного распространения при оптимизации градиентного спуска.

Крижевский релу vs танх

сплошная линия - ReLU
пунктирная линия - tanh

ReLU в Numpy

массив ([1., 0., 0., 0.32])

ReLU в Pytorch

тензор ([1.0000, 0.0000, 0.0000, 0.3200], dtype = torch.float64)

Нормализация местного ответа

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

Нормализация местного отклика в Pytorch

torch.Size ([20, 3, 10, 10])

Архитектура

torch.Size ([1, 1000])

Уменьшение переобучения

Увеличение данных

Самый простой способ избежать чрезмерной подгонки - увеличить размер данных, чтобы модель могла изучить более общие характеристики данных.

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

Доступно множество типов методов увеличения данных.

  1. Отразить (по горизонтали и вертикали)
  2. Вращение
  3. Масштабирование
  4. Обрезать
  5. Перевод
  6. Гауссов шум

Выбывать

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

Пропуск в Numpy

массив ([
[0., 2.12769017, -1.95883643],
[0.05583112, -0.51280684, 0.],
[-1.64030713, 3.15857694, 1.13236446]])

Пропадание в Pytorch

тензор ([
[0.9667, 0.0000, 2.1510],
[1.4301, 0.0000, 1.4544],
[-0.0000, 1.3651, -0.0000]], dtype = torch.float64)

Обучение

Используется оптимизатор градиентного спуска с моментом 0,9 и спадом веса 0,0005. Размер партии 128.

Инициализаторы веса / смещения

Вес в каждом слое инициализируется из нулевого среднего гауссова распределения со стандартным отклонением 0,01. bias был инициализирован 1.

планировщик lr

ручная регулировка скорости обучения и уменьшение lr, когда потери перестали расти.

Инициализатор веса / смещения с Numpy

Введите X =
[[0,9769654 0,91344693 0,26452228]
[0,24474425 0,75985733 0,0462379]
[0,80824044 0,9641414 0,89342702]]

Инициализированный вес w = [[-0.00945599] [-0.00674226] [0.00975576]] Инициализированное смещение b = [[1.] [1.] [1.]]

массив ([[0,98718374], [0,99301363], [0,99457285]])

Свяжитесь со мной
LinkedIn - https://www.linkedin.com/in/shangeth
Github - https://github.com/shangeth
Twitter - https: / /twitter.com/shangethr