Ли Хунъи "Глубокое обучение" (6)

искусственный интеллект
Ли Хунъи "Глубокое обучение" (6)

Волна искусственного интеллекта захлестывает мир, и многие слова всегда звучат у нас в ушах: искусственный интеллект (Artificial Intelligence), машинное обучение (Machine Learning), глубокое обучение (Deep Learning). Эта статья предназначена в основном для того, чтобы разобраться в примечаниях к содержанию курса Ли Хунъи, и в конце статьи дана справочная ссылка.

10. Сверточная нейронная сеть (CNN)

Обзор

Нейронные сети являются частью области исследований искусственного интеллекта.В настоящее время наиболее популярной нейронной сетью являются глубокие сверточные нейронные сети (CNN).Хотя сверточные сети также имеют неглубокие структуры, их точность и редко используется по таким причинам, как выразительность. В настоящее время, когда речь идет о сверточных нейронных сетях и сверточных нейронных сетях, академические и промышленные круги уже не делают особых различий, в основном речь идет о сверточных нейронных сетях с глубокой структурой, а количество слоев варьируется от «несколько слоев» до «десятков сотен». ".

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

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

сетевая структура

БазовыйCNNЗависит от свертка(convolution), активация(activation), and объединение(объединение) состоит из трех структур. Результатом вывода CNN является определенное пространство признаков для каждого изображения. При решении задач классификации изображений мы используем пространство признаков выходных данных CNN какПолностью связанный слой или полностью связанная нейронная сетьВход (полностью связанная нейронная сеть, FCN) использует полносвязный слой для завершения сопоставления входного изображения с набором меток, то есть классификации. Конечно, самая важная работа всего процесса заключается в том, как итеративно корректировать веса сети с помощью обучающих данных, то естьАлгоритм обратного распространения.

Сеть CNN имеет в общей сложности 5 иерархических структур:

1. Входной слой

Общие методы предварительной обработки во входном слое:

  • унижать
  • Нормализованный
  • уменьшение размерности ППШ/СВД и др.

2. Сверточный слой

3. Активационный слой

Так называемое возбуждение на самом деле является нелинейным отображением выходных данных сверточного слоя. Если функция возбуждения не используется (фактически функция возбуждения есть f(x)=x), то в этом случае выход каждого слоя является линейной функцией входа предыдущего слоя. Несложно сделать вывод, что сколько бы ни было слоев нейронной сети, выход представляет собой линейную комбинацию входа, а эффект тот же, что и без скрытого слоя — это самый примитивный персептрон. 

Обычно используемые функции возбуждения:

  • Сигмовидная функция
  • Тан функция
  • ReLU
  • Leaky ReLU
  • ELU
  • Maxout

Рекомендации слоя поощрения:Сначала ReLU, потому что скорость итерации высокая, но это может не сработать. Если ReLU не работает, рассмотрите возможность использования Leaky ReLU или Maxout, которые можно решить в целом. Функция Tanh хорошо работает при обработке текста и аудио.10 наиболее часто используемых функций активации для глубокого обучения

4. Слой пула

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

  • Max Pooling: максимальный пул (максимальное значение окна пула) — используется чаще.
  • Средний пул: средний пул (среднее количество окон пула)

5. Полностью подключенный слой FC

После нескольких предыдущих свёрток + возбуждения + пула, наконец, дошло до выходного слоя, и модель полностью подключит к слою изученное качественное изображение признака. Фактически, до полносвязного слоя, если количество нейронов слишком велико, а способность к обучению сильна, может произойти переобучение. Следовательно, можно ввестиdropoutоперация (случайное удаление некоторых нейронов в нейронной сети) для решения этой проблемы. также можно сделатьЛокальная нормализация (LRN),увеличение данныхи другие операции для повышения надежности. Когда дело доходит до полносвязного слоя, его можно понимать как простую мультиклассовую нейронную сеть (например, нейронную сеть BP), а конечный результат получается с помощью функции softmax. Вся модель обучена. 

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

Эти слои описаны ниже:


входной слой

Слой ввода данных: Входной слой, который в основном используется в качестве ввода сети.На этом уровне мы в основном предварительно обрабатываем данные и определяем форму ввода в соответствии с характеристиками входных данных. Если вы хотите выполнить 2D-свертку, взяв в качестве примера keras, данные необходимо обработать в:(samples, channels, rows, cols)в:

  • образец: количество образцов
  • каналы: количество каналов, это в основном глубина входных данных, если изображение представляет собой изображение в градациях серого, то глубина равна 1, если это цветное изображение, то оно состоит из 3-х каналов RGB.
  • rows: можно представить как количество строк входной матрицы
  • cols: можно представить как количество столбцов входной матрицы

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

image.png


сверточный слой

Прежде чем объяснять свертки, нам нужно знать следующие термины и их значения:

  • фильтры: количество фильтров
  • обивка: обивка
  • шаг: размер шага
  • kernel_width: ширина ядра свертки
  • kernel_height: длина ядра свертки

Следующий рисунок является примером

image.png

Зеленый кружок представляет собой входную матрицу, очевидно, она имеет 3 слоя, поэтому канал равен 3.

Синий кружок представляет ядро ​​свертки, а его ширина и высота соответствуют значениям kernel_width и kernel_height.

Красные кружки представляют фильтры, и при наличии нескольких фильтров имеется несколько ядер свертки.

Среди них вам нужно понять взаимосвязь между фильтром и каналом:

  1. Образец исходного входного изображенияchannels, в зависимости от типа изображения, например RGB;
  2. Результат после завершения операции сверткиout_channels, зависит от количества ядер свертки. В настоящее времяout_channelsОн также будет использоваться в качестве ядра свертки для следующей свертки.in_channels;
  3. в ядре сверткиin_channels, только что упомянутый в 2, это последняя сверткаout_channels, если свертку делать впервые, это образец изображения в 1channels.

Основная операция

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

image.pngПрежде всего, первый фильтр представляет собой матрицу 3*3, поместите этот фильтр в верхний левый угол изображения и сделайте скалярное произведение 9 значений фильтра и 9 значений изображения, обе стороны равны 1, 1, 1 (косой парный угол), результат скалярного произведения равен 3. Тогда указанный шаг равен 1, поэтому переместитесь на 1 расстояние вправо, а затем снова рассчитайте, чтобы получить -1. После скольжения исходного изображения вверх и вниз получается новая карта признаков. Если вы еще не поняли, вы можете увидеть картинку ниже

image.png

padding

Где отступы должны заполнить карту входных объектов.

image.pngКрасная часть — это заполнение, которое можно установить, установив padding=? Определяет количество слоев для заполнения периферии.

Зачем заполнять?Если отступа нет, то после каждой свертки будут следующие проблемы:

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

Итак, добавив отступы, это решеноРазмер карты объектов становится все меньше и меньшеПроблема. Одновременная проверка сверткиинформация о границеОбработка выполняется более одного раза, и извлечения информации о границах более чем достаточно.

окончательный расчет

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

截屏2020-07-19 下午9.32.25.png

Вводя ширину и высоту исходной карты объектов, можно рассчитать ширину и высоту следующей выходной карты объектов.Количество каналов, вводимых в следующий слой, представляет собой количество фильтров для этой свертки.


слой активации

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

Наиболее часто используемая нелинейная функция активации в нейронных сетях:Функция Relu, его формула определяется следующим образом:

f(x)=max(0,x)

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

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

Функциональное выражение relu, relu(x)=max(x,0) или выражение, записанное в виде кусочной функции:

截屏2020-07-20 上午11.56.58.png

Когда x>0, производная функции прямо равна 1, и проблема затухания градиента отсутствует. Хотя функция ReLU облегчает проблему исчезновения градиента, она также создает другую проблему, а именно проблему смерти градиента. Видно, что при x

20200318140644754.png

Преимущества Релу:

  1. Облегчает проблему исчезновения градиента (когда x>0, производная функции прямо равна 1, и нет проблемы затухания градиента)
  2. Расчет очень прост (для суждения нужно использовать только порог, а производную вряд ли нужно вычислять)
  3. Может генерировать разреженность (часть меньше 0 напрямую устанавливается на 0, что делает промежуточный вывод нейронной сети разреженным и имеет определенный эффект отсева, который может в определенной степени предотвратить переоснащение)

объединяющий слой

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

Существует два типа объединения: максимальное объединение и среднее объединение. Как следует из названия, максимальное объединение должно принимать максимальное значение, а среднее объединение — среднее значение.

image.png

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

Слой объединения определяет размер выходной карты объектов в соответствии с размером выходного изображения после свертки и размером окна объединения:

截屏2020-07-19 下午9.35.17.png


полносвязный слой

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

Flatten — это выпрямление карты признаков.После выпрямления ее можно бросить в полносвязную сеть прямого распространения, и тогда все кончено.

image.png


Расчет параметров

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

h(x)=f(wx+b) Приведенная выше формула представляет собой функцию, представленную нейроном, x представляет вход i, w представляет вес, b представляет смещение, f представляет функцию активации, а h(x) представляет выход.

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

Вес w и смещение b эквивалентны памяти нейрона.

Причина добавления смещения:

Без смещения b функция должна проходить через начало координат, и область применения классификации меньше.

Обратитесь к роли параметров w, b в нейронной сети (объяснение, почему требуется смещение b)

Таким образом, это можно рассчитать как:

每一层的parameter=(kernel_width*kernel_height+1)*in_channel(+1 добавить смещение b)

Ниже представлена ​​структура сети и соответствующая информационная таблица каждого уровня.

流量识别卷积神经网络结构.png

image.png

CNN пример кераса

Введите дизайн:

x_train = x_train.reshape(x_train.shape[0], img_x, img_y, 1) #(samples, rows, cols, channels)

Дизайн модели:

model = Sequential() #初始化模型 
#卷积层,stride默认是1
model.add(Conv2D(32, kernel_size=(5, 5), activation='relu', input_shape=(img_x, img_y, 1)))
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2))) #池化层 
model.add(Conv2D(64, kernel_size=(5, 5), activation='relu')) #卷积层 
model.add(MaxPool2D(pool_size=(2, 2), strides=(2, 2))) #池化层 
model.add(Flatten()) #全连接层 
model.add(Dense(1000, activation='relu')) #全连接层 
model.add(Dense(10, activation='softmax')) #softmax分类输出

Ниже приведена схема структуры сети, соответствующая коду модели.

手写体识别网络结构.pngСсылка на ссылку: