No Image

Ян лекун сверточные нейронные сети

СОДЕРЖАНИЕ
1 просмотров
22 января 2020

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

Немного теории.

Свёрточная нейронная сеть (англ.convolutional neural network, CNN) — специальная архитектура искусственных нейронных сетей, предложенная Яном Лекуном в 1988 году и нацеленная на эффективное распознавание образов, Использует некоторые особенности зрительной коры, в которой были открыты так называемые простые клетки, реагирующие на прямые линии под разными углами, и сложные клетки, реакция которых связана с активацией определённого набора простых клеток.

Свёрточными сети называются так из за операции свертки, которая является основой всей сети. В этих сетях нету привычных связей и весовых коэффициентов. Вместо этого используется ядро свертки размером от 3х3 до 7х7. Операция свертки выделяет какой то признак в картинке, например переход от светлого пикселя к темному. Признаки зависят от ядра. Например в базе MNIST наши рукописные цифры это черно-белая картинка размером 28х28 (каждый пиксель имеет значения яркости от 0 до 255). По этой матрице мы проходим ядром и производим операцию свертки. После этого мы получаем слой свертки ( обычно такового размера , но бывает что большего или меньшего) или карту признака.

Автор: Michael Plotke

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

Автор: Aphex34

Keras. Создаем сеть.

Keras — открытая нейросетевая библиотека, написанная на языке Python. Она представляет собой надстройку над фреймворками TensorFlow, упрощая работу с последним.

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

Первым делом ставим TensorFlow , потом Keras. Далее нам надо будет понизить ваш numpy до 1.16.4.

База MNIST уже есть в данных нашей библиотеки, загружаем базу:

Функция reshape() изменяет форму массива без изменения его данных.

Тестовые данные нам тоже надо преобразовать.

Построение модели сети.

Теперь у нас все готово к построению нашей нейро-сети.

Первый слой будет сверточный двухмерный ( Conv2D ) . Эти сверточные слои будут работать с входными изображениями, которые рассматриваются как двумерные матрицы. kernel_size =3 — размер ядра 3х3. Функция активации ‘relu’ ( Rectified Linear Activation ) , 64 это число ядер свертки( сколько признаком будем искать)

Flatten() – слой, преобразующий 2D-данные в 1D-данные.

Dense() — полносвязный слов, число выходов — 10 , функция активации ‘softmax’ .

Далее, нам нужно скомпилировать нашу модель. Компиляция модели использует три параметра: оптимизатор, потери и метрики.

Оптимизатор весов optimizer=’adam’ (Адам: метод стохастической оптимизации). Функция потерь : loss=’categorical_crossentropy’ категориальная перекрестная энтропия (categorical crossentropy CCE). Последний параметр я не очень понял что такое :

metrics: List of metrics to be evaluated by the model during training and testing. Typically you will use metrics=[‘accuracy’] . To specify different metrics for different outputs of a multi-output model, you could also pass a dictionary, such as metrics= <‘output_a’: ‘accuracy’>.

Теперь запускаем обучение сети :

epochs=1 число эпох , val > — проверочные данные

Визуализация, эксперименты, сохранение.

Давайте построим графики обучения для наглядности. Благо метод fit() возвращает историю обучения.

Добавим слой Пулинг по Максимуму, и запустим на 10 эпох. Так же поменяем функцию ошибки и оптимизации.

Сохранение / загрузка целых моделей (архитектура + веса + состояние оптимизатора)

Вы можете использовать model.save(filepath) для сохранения модели Keras в один файл HDF5, который будет содержать:

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

Использование GPU.

Если вы работаете на TensorFlow или CNTK backends, ваш код автоматически запускается на GPU, если обнаружен какой-либо доступный GPU.

  • tensorflow —Latest stable release for CPU-only
  • tensorflow-gpu —Latest stable release with GPU support (Ubuntu and Windows)

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

Свёрточная нейронная сеть (англ. convolutional neural network , CNN) — специальная архитектура искусственных нейронных сетей, предложенная Яном Лекуном в 1988 году [1] и нацеленная на эффективное распознавание образов [2] , входит в состав технологий глубокого обучения (англ. deep learning ). Использует некоторые особенности зрительной коры [3] , в которой были открыты так называемые простые клетки, реагирующие на прямые линии под разными углами, и сложные клетки, реакция которых связана с активацией определённого набора простых клеток. Таким образом, идея свёрточных нейронных сетей заключается в чередовании свёрточных слоёв (англ. convolution layers ) и субдискретизирующих слоёв (англ. subsampling layers или англ. pooling layers , слоёв подвыборки). Структура сети — однонаправленная (без обратных связей), принципиально многослойная. Для обучения используются стандартные методы, чаще всего метод обратного распространения ошибки. Функция активации нейронов (передаточная функция) — любая, по выбору исследователя.

Читайте также:  Установка windows 7 просит драйвер cd dvd

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

Содержание

Интерпретация [ править | править код ]

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

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

Архитектура и принцип работы [ править | править код ]

В обычном перцептроне, который представляет собой полносвязную нейронную сеть, каждый нейрон связан со всеми нейронами предыдущего слоя, причём каждая связь имеет свой персональный весовой коэффициент. В свёрточной нейронной сети в операции свёртки используется лишь ограниченная матрица весов небольшого размера, которую «двигают» по всему обрабатываемому слою (в самом начале — непосредственно по входному изображению), формируя после каждого сдвига сигнал активации для нейрона следующего слоя с аналогичной позицией. То есть для различных нейронов выходного слоя используются одна и та же матрица весов, которую также называют ядром свёртки. Её интерпретируют как графическое кодирование какого-либо признака, например, наличие наклонной линии под определённым углом. Тогда следующий слой, получившийся в результате операции свёртки такой матрицей весов, показывает наличие данного признака в обрабатываемом слое и её координаты, формируя так называемую карту признаков (англ. feature map ). Естественно, в свёрточной нейронной сети набор весов не один, а целая гамма, кодирующая элементы изображения (например линии и дуги под разными углами). При этом такие ядра свёртки не закладываются исследователем заранее, а формируются самостоятельно путём обучения сети классическим методом обратного распространения ошибки. Проход каждым набором весов формирует свой собственный экземпляр карты признаков, делая нейронную сеть многоканальной (много независимых карт признаков на одном слое). Также следует отметить, что при переборе слоя матрицей весов её передвигают обычно не на полный шаг (размер этой матрицы), а на небольшое расстояние. Так, например, при размерности матрицы весов 5×5 её сдвигают на один или два нейрона (пикселя) вместо пяти, чтобы не «перешагнуть» искомый признак.

Операция субдискретизации (англ. subsampling , англ. pooling , также переводимая как «операция подвыборки» или операция объединения), выполняет уменьшение размерности сформированных карт признаков. В данной архитектуре сети считается, что информация о факте наличия искомого признака важнее точного знания его координат, поэтому из нескольких соседних нейронов карты признаков выбирается максимальный и принимается за один нейрон уплотнённой карты признаков меньшей размерности. За счёт данной операции, помимо ускорения дальнейших вычислений, сеть становится более инвариантной к масштабу входного изображения.

Рассмотрим типовую структуру свёрточной нейронной сети более подробно. Сеть состоит из большого количества слоёв. После начального слоя (входного изображения) сигнал проходит серию свёрточных слоёв, в которых чередуется собственно свёртка и субдискретизация (пулинг). Чередование слоёв позволяет составлять «карты признаков» из карт признаков, на каждом следующем слое карта уменьшается в размере, но увеличивается количество каналов. На практике это означает способность распознавания сложных иерархий признаков. Обычно после прохождения нескольких слоёв карта признаков вырождается в вектор или даже скаляр, но таких карт признаков становятся сотни. На выходе свёрточных слоёв сети дополнительно устанавливают несколько слоёв полносвязной нейронной сети (перцептрон), на вход которому подаются оконечные карты признаков.

Читайте также:  Устройство не поддерживает root

Слой свёртки [ править | править код ]

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

Особенностью свёрточного слоя является сравнительно небольшое количество параметров, устанавливаемое при обучении. Так например, если исходное изображение имеет размерность 100×100 пикселей по трём каналам (это значит 30000 входных нейронов), а свёрточный слой использует фильтры c ядром 3×3 пикселя с выходом на 6 каналов, тогда в процессе обучения определяется только 9 весов ядра, однако по всем сочетаниям каналов, то есть 9×3×6 =162, в таком случае данный слой требует нахождения только 162 параметров, что существенно меньше количества искомых параметров полносвязной нейронной сети.

Слой активации [ править | править код ]

Скалярный результат каждой свёртки попадает на функцию активации, которая представляет собой некую нелинейную функцию. Слой активации обычно логически объединяют со слоем свёртки (считают, что функция активации встроена в слой свёртки). Функция нелинейности может быть любой по выбору исследователя, традиционно для этого использовали функции типа гиперболического тангенса ( f ( x ) = tanh ⁡ ( x ) <displaystyle f(x)= anh(x)> , f ( x ) = | tanh ⁡ ( x ) | <displaystyle f(x)=| anh(x)|> ) или сигмоиды ( f ( x ) = ( 1 + e − x ) − 1 <displaystyle f(x)=(1+e^<-x>)^<-1>> ). Однако в 2000х годах была предложена [4] и исследована [5] новая функция активации — ReLU (сокращение от англ. rectified linear unit ), которая позволила существенно ускорить процесс обучения и одновременно упростить вычисления (за счёт простоты самой функции) [6] , что означает блок линейной ректификации, вычисляющий функцию f ( x ) = max ( 0 , x ) <displaystyle f(x)=max(0,x)> . То есть по сути это операция отсечения отрицательной части скалярной величины. По состоянию на 2017 год эта функция и её модификации (Noisy ReLU, Leaky ReLU и другие) являются наиболее часто используемыми функциями активации в глубоких нейросетях, в частности, в свёрточных. Существует методика определения оптимального числа блоков линейной ректификации [7] .

Пулинг или слой субдискретизации [ править | править код ]

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

Кроме пулинга с функцией максимума можно использовать и другие функции — например, среднего значения или L2-нормирования. Однако практика показала преимущества именно пулинга с функцией максимума, который включается в типовые системы.

В целях более агрессивного уменьшения размера получаемых представлений, всё чаще находят распространение идеи использования меньших фильтров [8] или полный отказ от слоёв пулинга. [9]

Полносвязная нейронная сеть [ править | править код ]

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

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

Обучение [ править | править код ]

Наиболее простым и популярным способом обучения является метод обучения с учителем (на маркированных данных) — метод обратного распространения ошибки и его модификации. Но существует также ряд техник обучения свёрточной сети без учителя. Например, фильтры операции свёртки можно обучить отдельно и автономно, подавая на них вырезанные случайным образом кусочки исходных изображений обучающей выборки и применяя для них любой известный алгоритм обучения без учителя (например, автоассоциатор или даже метод k-средних) — такая техника известна под названием patch-based training . Соответственно, следующий слой свёртки сети будет обучаться на кусочках от уже обученного первого слоя сети. Также можно скомбинировать сверточную нейросеть с другими технологиями глубинного обучения. Например, сделать свёрточный авто-ассоциатор [10] , свёрточную версию каскадных ограниченных машин Больцмана, обучающихся за счёт вероятностного математического аппарата [11] , свёрточную версию разреженного кодирования (англ. sparse coding ), названную deconvolutional networks («развертывающими» сетями) [12] .

Читайте также:  Файловый сервер для офиса

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

Сверточная нейронная сеть (англ. convolutional neural network, CNN) — специальная архитектура нейронных сетей, предложенная Яном Лекуном [1] , изначально нацеленная на эффективное распознавание изображений.

Содержание

Свертка [ править ]

Свертка (англ. convolution) — операция над парой матриц [math]A[/math] (размера [math]n_x imes n_y[/math] ) и [math]B[/math] (размера [math]m_x imes m_y[/math] ), результатом которой является матрица [math]C = A * B[/math] размера [math](n_x-m_x+1) imes (n_y-m_y+1)[/math] . Каждый элемент результата вычисляется как скалярное произведение матрицы [math]B[/math] и некоторой подматрицы [math]A[/math] такого же размера (подматрица определяется положением элемента в результате). То есть, [math]C_ = sum_^sum_^A_B_[/math] . На изображении справа можно видеть, как матрица [math]B[/math] «двигается» по матрице [math]A[/math] , и в каждом положении считается скалярное произведение матрицы [math]B[/math] и той части матрицы [math]A[/math] , на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.

Логический смысл свертки такой — чем больше величина элемента свертки, тем больше эта часть матрицы [math]A[/math] была похожа на матрицу [math]B[/math] (похожа в смысле скалярного произведения). Поэтому матрицу [math]A[/math] называют изображением, а матрицу [math]B[/math] — фильтром или образцом.

Структура сверточной нейронной сети [ править ]

В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. convolutional layer), пулинговые слои (англ. pooling layer) и полносвязные слои (англ. fully-connected layer).

Сверточный слой [ править ]

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

  • В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность [math]w imes h[/math] , а в слое было [math]n[/math] сверток с ядром размерности [math]k_x imes k_y[/math] , то выход будет иметь размерность [math]n imes(w — k_x + 1) imes(h — k_y + 1)[/math] ;
  • Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности [math]3 imes w imes h[/math] . На выходе такого слоя будет уже одно изображение (вместо трёх);
  • Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения участвуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. padding). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют одинаковыми (англ. same convolution), а свертки без дополнения изображения называются правильными (англ. valid convolution). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:
  • zero shift: 00[ABC]00 ;
  • border extension: AA[ABC]CC ;
  • mirror shift: BA[ABC]CB ;
  • cyclic shift: BC[ABC]AB .
  • Еще одним параметром сверточного слоя является сдвиг (англ. str >[math]s[/math] . Тогда, если если вход имел размерность [math]w imes h[/math] , а ядро свертки имело размерность [math]k_x imes k_y[/math] и использовался сдвиг [math]s[/math] , то выход будет иметь размерность [math]lfloorfrac+ 1
    floor imeslfloorfrac
    + 1
    floor[/math] .

Пулинговый слой [ править ]

Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером [math]w imes h[/math] и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. max pooling) или (взвешенного) среднего (англ. (weighted) average pooling). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:

  • уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;
  • увеличение инвариантности выхода сети по отношению к малому переносу входа;
  • ускорение вычислений.
Комментировать
1 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
No Image Компьютеры
0 комментариев
Adblock detector