Задайте слои сверточной нейронной сети

Первым шагом создания и обучения новой сверточной нейронной сети (ConvNet) является определение сетевой архитектуры. В этом разделе описываются детали слоев ConvNet и порядок их появления в ConvNet. Полный список слоев глубокого обучения и способы их создания см. в Списке слоев глубокого обучения. Чтобы узнать о сетях LSTM для классификации и регрессии последовательностей, смотрите Long Short-Term Memory Networks. Чтобы узнать, как создать свои собственные пользовательские слои, смотрите Задать Пользовательские Слои Глубокого Обучения.

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

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

layers = [
    imageInputLayer([28 28 1])  
    convolution2dLayer(3,16,'Padding',1)
    batchNormalizationLayer
    reluLayer    
    maxPooling2dLayer(2,'Stride',2) 
    convolution2dLayer(3,32,'Padding',1)
    batchNormalizationLayer
    reluLayer 
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];
layers является массивом Layer объекты. Затем можно использовать layers как вход в функцию обучения trainNetwork.

Чтобы задать архитектуру нейронной сети со всеми слоями, соединенными последовательно, создайте массив слоев непосредственно. Чтобы задать архитектуру сети, где слои могут иметь несколько входов или выходов, используйте LayerGraph объект.

Входной слой изображения

Создайте входной слой изображения с помощью imageInputLayer.

Входной слой изображений вводит изображения в сеть и применяет нормализацию данных.

Укажите размер изображения с помощью inputSize аргумент. Размер изображения соответствует высоте, ширине и количеству цветовых каналов этого изображения. Для примера для полутонового изображения количество каналов составляет 1, а для цветного изображения - 3.

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

Сверточный слой 2-D применяет сверточные фильтры скольжения к входу. Создайте 2-D сверточный слой с помощью convolution2dLayer.

Сверточный слой состоит из различных компонентов.[1]

Фильтры и полосатик

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

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

Это изображение показывает сканирование фильтра 3 на 3 через вход. Нижняя карта представляет вход, а верхняя карта представляет выход.

Размер шага, с которым перемещается фильтр, называется шагом. Размер шага можно задать с помощью Stride аргумент пары "имя-значение". Локальные области, с которыми соединяются нейроны, могут перекрываться в зависимости от filterSize и 'Stride' значения.

Это изображение показывает сканирование фильтра 3 на 3 через вход с шагом 2. Нижняя карта представляет вход, а верхняя карта представляет выход.

Количество весов в фильтре h * w * c, где h - высота, а w - ширина фильтра, соответственно, и c - количество каналов во входе. Для примера, если вход является цветным изображением, количество цветовых каналов составляет 3. Количество фильтров определяет количество каналов в выходе сверточного слоя. Задайте количество фильтров, использующих numFilters аргумент с convolution2dLayer функция.

Расширенная свертка

Расширенная свертка является сверткой, в которой фильтры расширены пространствами, вставленными между элементами фильтра. Определите коэффициент расширения с помощью 'DilationFactor' свойство.

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

Слой расширяет фильтры путем вставки нулей между каждым фильтрующим элементом. Коэффициент расширения определяет размер шага для дискретизации входа или эквивалентно коэффициента повышающей дискретизации фильтра. Он соответствует эффективному размеру фильтра (Filter Size - 1). * Dilation Factor + 1. Для примера - фильтр 3 на 3 с коэффициентом расширения [2 2] эквивалентен фильтру 5 на 5 с нулями между элементами.

Это изображение показывает фильтр 3 на 3, расширенный в два раза сканированием через вход. Нижняя карта представляет вход, а верхняя карта представляет выход.

Карты функций

Когда фильтр перемещается вдоль входа, он использует тот же набор весов и то же смещение для свертки, формируя карту функций. Каждая карта функций является результатом свертки с использованием другого набора весов и другого смещения. Следовательно, количество карт функций равно количеству фильтров. Общее количество параметров в сверточном слое является ((h * w * c + 1) * Number of Filters), где 1 является смещением.

Набивка

Можно также применить заполнение для ввода границ изображения вертикально и горизонтально с помощью 'Padding' аргумент пары "имя-значение". Заполнение - это значения, присоединенные к границам входа, чтобы увеличить его размер. Корректировкой заполнения можно управлять выход размера слоя.

Это изображение показывает сканирование фильтра 3 на 3 через вход с заполнением размера 1. Нижняя карта представляет вход, а верхняя карта представляет выход.

Выход

Выходная высота и ширина сверточного слоя (Input Size - ((Filter Size - 1) * Dilation Factor + 1) + 2 * Padding )/ Stride + 1. Это значение должно быть целым числом для полного покрытия всего изображения. Если комбинация этих опций не приводит к полному покрытию изображения, программное обеспечение по умолчанию игнорирует оставшуюся часть изображения вдоль правых и нижних ребер свертки.

Количество нейронов

Продукты высоты и ширины выхода дает общее количество нейронов в карте функции, скажем Map Size. Общее количество нейронов (выход размер) в сверточном слое составляет Map Size * Number of Filters.

Например, предположите, что изображение входа - цветное изображение 32 на 32 на 3. Для сверточного слоя с восемью фильтрами и размером фильтра 5 на 5 количество весов на фильтр составляет 5 * 5 * 3 = 75, а общее количество параметров в слое составляет (75 + 1) * 8 = 608. Если шаг 2 в каждом направлении и задано заполнение 2 размера, то каждая карта функции 16 на 16. Это потому, что (32 - 5 + 2 * 2 )/2 + 1 = 16,5, и некоторые из крайних заполнений справа и внизу изображения отбрасываются. Наконец, общее количество нейронов в слое составляет 16 * 16 * 8 = 2048.

Обычно результаты этих нейронов проходят через некоторую форму нелинейности, такую как выпрямленные линейные модули (ReLU).

Параметры обучения

Можно настроить скорости обучения и опции регуляризации для слоя, используя аргументы пары "имя-значение" при определении сверточного слоя. Если вы решите не задавать эти опции, то trainNetwork использует глобальные опции обучения, заданные в trainingOptions функция. Для получения дополнительной информации об опциях глобального и слоевого обучения смотрите Настройте Параметры и Обучите Сверточную Нейронную Сеть.

Количество слоев

Сверточная нейронная сеть может состоять из одного или нескольких сверточных слоев. Количество сверточных слоев зависит от объема и сложности данных.

Нормализация партии .

Создайте слой нормализации партии . с помощью batchNormalizationLayer.

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

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

Нормализации партии . нормализуют активации и градиенты, распространяющиеся через нейронную сеть, что делает обучение сети более легкой задачей оптимизации. Чтобы в полной мере воспользоваться этим фактом, можно попробовать увеличить скорость обучения. Поскольку задача оптимизации проще, обновления параметров могут быть больше, и сеть может учиться быстрее. Можно также попробовать уменьшить регуляризацию L2 и отсева. С нормализацией партии . слоями активация определенного изображения во время обучения зависит от того, какие изображения окажутся в том же мини-пакете. Чтобы в полной мере воспользоваться этим регуляризирующим эффектом, попробуйте перетасовать обучающие данные перед каждой эпохой обучения. Чтобы указать, как часто тасовать данные во время обучения, используйте 'Shuffle' Аргумент пары "имя-значение" из trainingOptions.

Слой ReLU

Создайте слой ReLU с помощью reluLayer.

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

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

f(x)={x,x00,x<0.

Слой ReLU не изменяет размер своего входа.

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

Слой нормализации кросс-канала (нормализация локального ответа)

Создайте слой нормализации кросс-каналов с помощью crossChannelNormalizationLayer.

Слой нормализации локального отклика (перекрестного канала) канала выполняет нормализацию канала.

Этот слой выполняет канальную локальную нормализацию отклика. Обычно он следует за слоем активации ReLU. Этот слой заменяет каждый элемент нормированным значением, которое он получает с помощью элементов из определенного количества соседних каналов (элементов в окне нормализации). То есть для каждого элемента x во входе, trainNetwork вычисляет нормированное значение x' использование

x'=x(K+α*sswindowChannelSize)β,

где K, α и β - гиперпараметры в нормализации, а ss - сумма квадратов элементов в окне нормализации [2]. Размер окна нормализации необходимо задать с помощью windowChannelSize аргумент crossChannelNormalizationLayer функция. Вы также можете задать гиперпараметры, используя Alpha, Beta, и K Аргументы пары "имя-значение".

Предыдущая формула нормализации немного отличается от той, которая представлена в [2]. Эквивалентную формулу можно получить, умножив alpha значение по windowChannelSize.

Максимальный и средний слои объединения

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

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

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

Максимальный слой объединения возвращает максимальные значения прямоугольных областей его входа. Размер прямоугольных областей определяется poolSize аргумент maxPoolingLayer. Для примера, если poolSize равен [2,3]затем слой возвращает максимальное значение в областях высоты 2 и ширины 3.A средний слой объединения выводит средние значения прямоугольных областей его входов. Размер прямоугольных областей определяется poolSize аргумент averagePoolingLayer. Для примера, если poolSize равен [2,3], затем слой возвращает среднее значение областей высоты 2 и ширины 3.

Объединение слоев сканирует вход горизонтально и вертикально в размерах шага, которые можно задать используя 'Stride' аргумент пары "имя-значение". Если размер пула меньше или равен шагу, то области объединения не перекрываются.

Для непересекающихся областей (Pool Size и Stride равны), если вход в слой объединения равен n -by- n, и размер области объединения равен h -by- h, то слой объединения понижает выборки областей по h [6]. То есть выход максимального или среднего слоя объединения для одного канала сверточного слоя равен n/ h -by- n/ h. Для перекрывающихся областей выходной параметр слоя объединения является (Input Size - Pool Size + 2 * Padding )/ Stride + 1.

Слой отсева

Создайте слой отсева с помощью dropoutLayer.

Выпадающий слой случайным образом устанавливает элементы входа для нуля с заданной вероятностью.

Во время обучения слой случайным образом устанавливает входные элементы в нуль, заданный маской отсева rand(size(X))<Probability, где X является входом слоя, а затем масштабирует оставшиеся элементы по 1/(1-Probability). Эта операция эффективно изменяет базовую сетевую архитектуру между итерациями и препятствует сверхподбору кривой сети [7], [2]. Более высокое число приводит к падению большего количества элементов во время обучения. Во времени предсказания выход слоя равен его входу.

Подобно максимальным или средним слоям объединения, обучение в этом слое не происходит.

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

Создайте полносвязный слой с помощью fullyConnectedLayer.

A полносвязного слоя умножает вход на весовую матрицу и затем добавляет вектор смещения.

Сверточные (и понижающие) слои сопровождаются одним или несколькими полносвязными слоями.

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

Можно также настроить скорость обучения и параметры регуляризации для этого слоя, используя связанные аргументы пары "имя-значение" при создании полносвязного слоя. Если вы решите не настраивать их, то trainNetwork использует глобальные параметры обучения, заданные в trainingOptions функция. Для получения дополнительной информации об опциях глобального и слоевого обучения смотрите Настройте Параметры и Обучите Сверточную Нейронную Сеть.

A полносвязного слоя умножает вход на весовую матрицу W а затем добавляет вектор смещения b.

Если вход в слой является последовательностью (для примера, в сети LSTM), то полносвязный слой действует независимо на каждом временном шаге. Например, если слой перед полносвязным слоем выводит X массива размера D -by- N -by- S, то полносвязной слой выводит Z размера массива outputSize-by- N -by- S. На временном шаге t соответствующий вход Z являетсяWXt+b, где Xt обозначает временной шаг t из X.

Выходные слои

Слои Softmax и классификации

Слой softmax применяет функцию softmax к входу. Создайте слой softmax с помощью softmaxLayer.

Классификационный слой вычисляет потери перекрестной энтропии для задач классификации и взвешенной классификации с взаимоисключающими классами. Создайте слой классификации с помощью classificationLayer.

Для задач классификации слой softmax и затем слой классификации должны следовать за конечным полносвязным слоем.

Функция активации выходного модуля является функцией softmax:

yr(x)=exp(ar(x))j=1kexp(aj(x)),

где 0yr1 и j=1kyj=1.

Функция softmax является функцией активации выхода модуля после последнего полносвязного слоя для многоклассовых задач классификации:

P(cr|x,θ)=P(x,θ|cr)P(cr)j=1kP(x,θ|cj)P(cj)=exp(ar(x,θ))j=1kexp(aj(x,θ)),

где 0P(cr|x,θ)1 и j=1kP(cj|x,θ)=1. Более того, ar=ln(P(x,θ|cr)P(cr)), P(x,θ|cr) является условной вероятностью выборки, заданной для r класса, и P(cr) - класс, предшествующий вероятности.

Функция softmax также известна как нормированная экспоненциальная и может рассматриваться как многоклассовое обобщение логистической сигмоидной функции [8].

Для типичных сетей классификации слой классификации должен следовать за слоем softmax. В классификационном слое, trainNetwork принимает значения из функции softmax и присваивает каждый вход одному из K взаимоисключающих классов, используя функцию перекрестной энтропии для схемы кодирования 1- K [8]:

loss=1Nn=1Ni=1Kwitnilnyni,

где N - количество выборок, K - количество классов, wi - вес для i класса, tni является показателем того, что n-я выборка принадлежит к i-му классу, иyni - выход для n выборки для i класса, который в этом случае является значением из функции softmax. Другими словами, yni - вероятность того, что сеть связывает n-й вход с классом i.

Слой регрессии

Создайте слой регрессии, используя regressionLayer.

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

Для одного наблюдения средняя квадратная ошибка задается:

MSE=i=1R(tiyi)2R,

где R - количество откликов, ti - целевой выход, а yi - предсказание сети для i отклика.

Для регрессионных сетей изображение и последовательность-к-одному, функция потерь регрессионого слоя является квадратичной невязкой предсказанных реакций, не нормализованной по R:

loss=12i=1R(tiyi)2.

Для сетей регрессии изображение-изображение функцией потерь регрессионого слоя является квадратичная невязка предсказанных откликов для каждого пикселя, не нормализованная R:

loss=12p=1HWC(tpyp)2,

где H, W и C обозначают высоту, ширину и количество каналов выхода соответственно и p индексы в каждый элемент (пиксель) t и y линейно.

Для регрессионных сетей «последовательность-последовательность» функцией потерь регрессионого слоя является квадратичная невязка предсказанных ответов для каждого временного шага, не нормализованная R:

loss=12Si=1Sj=1R(tijyij)2,

где S - длина последовательности.

При обучении программное обеспечение вычисляет среднюю потерю по сравнению с наблюдениями в мини-пакете.

Ссылки

[1] Мерфи, К. П. Машинное обучение: вероятностная перспектива. Кембридж, Массачусетс: The MIT Press, 2012.

[2] Крижевский, А., И. Суцкевер, и Г. Е. Хинтон. «Классификация ImageNet с глубокими сверточными нейронными сетями». Усовершенствования в системах нейронной обработки информации. Том 25, 2012.

[3] LeCun, Y., Boser, B., Denker, J.S., Henderson, D., Howard, R.E., Hubbard, W., Jackel, L.D., et al. «Распознавание рукописных цифр в сети обратного распространения». В «Усовершенствованиях нейронных систем обработки информации», 1990.

[4] LeCun, Y., L. Bottou, Y. Bengio, and P. Haffner. «Обучение на основе градиента, применяемое к распознаванию документов». Материалы IEEE. Том 86, стр. 2278-2324, 1998.

[5] Наир, В. и Г. Э. Хинтон. «Исправленные линейные модули улучшают машины с ограничениями boltzmann». В проц. 27-я Международная конференция по машинному обучению, 2010.

[6] Nagi, J., F. Ducatelle, G. A. Di Caro, D. Ciresan, U. Meier, A. Giusti, F. Nagi, J. Schmidhuber, L. M. Gambardella. Max-Pooling Convolutional Neural Networks for Vision-based Hand Gesture Recognition (неопр.) (недоступная ссылка). IEEE International Conference on Signal and Image Processing Applications (ICSIPA2011), 2011.

[7] Шривастава, Н., Г. Хинтон, А. Крижевский, И. Суцкевер, Р. Салахутдинов. «Dropout: A Simple Way to Prevent Neural Networks From Overfitting». Журнал исследований машинного обучения. Том 15, стр. 1929 - 1958, 2014.

[8] Бишоп, C. M. Pattern Recognition and Машинное Обучение. Спрингер, Нью-Йорк, Нью-Йорк, 2006.

[9] Иоффе, Сергей и Кристиан Сегеди. «Нормализация партии .: ускорение глубокого сетевого обучения путем уменьшения внутреннего ковариатного сдвига». препринт, arXiv:1502.03167 (2015).

См. также

| | | | | | | | | | | | | | |

Похожие темы


[1] Изображение кредит: Свертка арифметика (лицензия)