Приветствую всех вОблачное сообщество Tencent, получить больше крупной технической практики Tencent по галантерее ~
Об авторе: Гао Ченгцай, инженер-разработчик Tencent для Android, был принят на работу в Tencent в апреле 2016 года. Он в основном отвечает за разработку функций и техническую оптимизацию Penguin e-sports push SDK и Penguin e-sports APP. Эта статья была опубликована вКолонка технической команды члена QQ
Эта статья предназначена в основном для уточнения учебных заметок курса CS231n, добавления некоторых книг по глубокому обучению и реальных боевых действий Tensorflow, а также знаний о структуре Caffe.
1. Сверточные нейронные сети
1.1 Сверточные нейронные сети и обычные нейронные сети
1.1.1 Сходства
Сверточная сеть — это тип нейронной сети, специально разработанный для обработки данных с сетчатой структурой. Это очень похоже на обычные нейронные сети: все они состоят из нейронов с способными к обучению весами и смещениями. Каждый нейрон получает некоторые входные данные, выполняет операцию внутреннего произведения, а затем выполняет операцию функции активации. Вся сеть по-прежнему представляет собой производную функцию оценки: вход функции — исходные пиксели изображения, а выход — оценки различных категорий. На последнем уровне (часто полносвязном слое) в сети все еще есть функция потерь (такая как SVM или Softmax), а различные приемы и точки, которые мы реализовали в нейронных сетях, по-прежнему применимы к сверточным нейронным сетям.
1.1.2 Различия
Структура сверточных нейронных сетей основана на предположении, что входные данные являются изображением, и на основе этого предположения мы добавляем к структуре некоторые уникальные свойства. Эти уникальные свойства делают функцию прямого распространения более эффективной для реализации и значительно сокращают количество параметров в сети. Входом в нейронную сеть обычной нейронной сети является вектор, который затем преобразуется в ряд скрытых слоев. Каждый скрытый слой состоит из нескольких нейронов, и каждый нейрон связан со всеми нейронами предыдущего слоя. Но в скрытом слое нейроны независимы друг от друга и не создают никаких связей.
Обычные нейронные сети не подходят для крупномасштабных изображений. В ЦИФАР-10 размер изображения 32х32х3 (ширина и высота 32 пикселя, 3 цветовых канала), поэтому в первом скрытом слое соответствующей условной нейронной сети каждый отдельный полносвязный нейрон составляет 32х32х3=3072. веса. Это количество кажется приемлемым, но ясно, что эта полносвязная структура не подходит для изображений большего размера. Например, изображение размером 200x200x3 будет иметь нейроны, содержащие 200x200x3 = 120 000 весов. И в сети должно быть больше одного нейрона, тогда количество параметров будет быстро увеличиваться! Очевидно, что такой метод полного подключения неэффективен, а большое количество параметров быстро приведет к переобучению сети.
Сверточная нейронная сеть более разумно подстраивает структуру под случай, когда на вход поступают все изображения, и получает массу преимуществ. В отличие от обычных нейронных сетей, нейроны в каждом слое сверточной нейронной сети располагаются в 3-х измерениях: ширине, высоте и глубине (здесь глубина относится к третьему измерению объема данных активации, а не к глубине всей сети, глубине вся сеть относится к количеству слоев сети). Вместо того, чтобы быть полностью связанными, мы увидим, что нейроны в слое будут связаны только с небольшой областью в предыдущем слое. На следующем рисунке показана схема традиционной нейронной сети и сверточной нейронной сети:
1.2 Структура сверточной нейронной сети
Простая сверточная нейронная сеть состоит из различных слоев, расположенных последовательно, и каждый слой в сети использует дифференцируемую функцию для передачи данных активации с одного слоя на другой. Сверточные нейронные сети в основном состоят из трех типов слоев: сверточных слоев, слоев пула (Pooling) и полносвязных слоев (полносвязные слои такие же, как и в обычных нейронных сетях). Накладывая эти слои друг на друга, можно построить полную свёрточную нейронную сеть, как показано на следующем рисунке:
1.2.1 Сверточный слой
Параметры сверточного слоя состоят из некоторого набора обучаемых фильтров. Каждый фильтр относительно мал в пространстве (ширина и высота), но имеет ту же глубину, что и входные данные. На прямом проходе пусть каждый фильтр скользит по ширине и высоте входных данных (точнее, по свертке), а затем вычисляет внутренний продукт всего фильтра и входных данных в любом месте. Когда фильтр скользит по ширине и высоте входных данных, создается двумерная карта активации, которая дает отклик фильтра в каждом пространственном местоположении. Интуитивно сеть заставляет фильтр учиться активироваться, когда он видит определенные типы визуальных особенностей, которые могут быть границами в определенных ориентациях, или пятнами определенных цветов на первом слое, или даже сотовым или колесообразным узором на более высоких слоях. сети. На каждом сверточном слое у нас был бы полный набор фильтров (скажем, 12), каждый из которых генерировал бы другую 2D-карту активации. Выходные данные генерируются путем наложения этих карт активации в направлении глубины.Как показано слева на следующем рисунке, изображение 32 * 32 проходит через несколько фильтров для выходных данных:
(1) Локальное подключение
Частичные соединения сильно снижают параметры сети. При работе с многомерными входными данными, такими как изображения, нецелесообразно, чтобы каждый нейрон был полностью связан со всеми нейронами в предыдущем слое. Вместо этого у нас есть каждый нейрон, подключенный только к одной локальной области входных данных. Пространственный размер этой связи называется рецептивным полем нейрона, а его размер — гиперпараметром (по сути, пространственным размером фильтра). В направлении глубины размер этого соединения всегда равен глубине входа. Опять же, мы относимся к пространственному измерению (ширине и высоте) иначе, чем к измерению глубины: связи локальны в пространстве (ширина и высота), но всегда соответствуют глубине входных данных.
(2) Пространственное расположение
Вышеизложенное объясняет, как каждый нейрон в сверточном слое связан с объемом входных данных, но не обсуждало количество нейронов в объеме выходных данных и их расположение. Есть 3 гиперпараметра, которые контролируют размер объема выходных данных: глубина, шаг и заполнение нулями. Вот их обсуждение:
1) Глубина тела выходных данных
Он соответствует количеству используемых фильтров, каждый из которых ищет что-то свое во входных данных. Например, если входными данными для первого сверточного слоя является необработанное изображение, то разные нейроны в измерении глубины, скорее всего, будут активированы границами в разных направлениях или цветными пятнами. Мы называем эти наборы нейронов с одинаковыми рецептивными полями, расположенными в направлении глубины, колонками глубины. Как показано на рисунке ниже, сверточный слой имеет всего 6 фильтров, и глубина выходных данных также равна 6.
2) Размер шага
При перемещении фильтра необходимо указать размер шага. Когда размер шага равен 1, фильтр перемещается на 1 пиксель за раз. Когда шаг равен 2 (реже 3 или больше, на практике они используются редко), фильтр перемещается на 2 пикселя за раз при скольжении. Эта операция уменьшает объем выходных данных в пространстве. Как показано на рисунке ниже, размер шага перемещения равен 1, размер входных данных равен 6*6, а размер выходных данных равен 4*4.
3) Заполнить
Выход фильтра сверточного слоя уменьшит размер данных.Как показано на рисунке ниже, вход 32 * 32 * 3 выводит данные размером 28 * 28 * 1, когда он проходит через фильтр 5 * 5 * 3.
И заполнение нулями имеет хорошее свойство, то есть оно может контролировать пространственный размер объема выходных данных (наиболее часто используется для сохранения пространственного размера объема входных данных, так что ширина и высота входных и выходных данных равны). Объем входных данных удобно дополнять нулями по краям, размер этого заполнения нулями является гиперпараметром. Как показано на рисунке ниже, ширина и высота входных и выходных данных поддерживаются за счет заполнения нулями.
Формула расчета выходных данных сверточного слоя:
Предположим, что размеры тела входных данных:
Четыре гиперпараметра сверточного слоя:
Тогда размер тела выходных данных:
в:
Общие настройки для этих гиперпараметров: F=3, S=1, P=1. Например, ввод 7x7, фильтр 3x3, размер шага 1 и заполнение 0, то можно получить вывод 5x5. Если шаг равен 2, результат равен 3x3.
(3) Совместное использование параметров
Использование совместного использования параметров в сверточных слоях используется для управления количеством параметров. Каждый фильтр локально подключен к предыдущему слою, и все локальные подключения каждого фильтра используют одни и те же параметры, что также значительно уменьшит параметры сети.
Вот разумное предположение: если признак полезен для вычисления определенного положения в пространстве (x, y), то он также полезен для вычисления другого положения (x2, y2). Исходя из этого предположения, количество параметров можно значительно сократить. Другими словами, один двумерный срез в измерении глубины рассматривается как срез глубины.Например, объем данных размером 55x55x96 имеет 96 срезов глубины, каждый размером 55x55. Нейроны на каждом срезе глубины используют одни и те же веса и смещения. При обратном распространении необходимо вычислить градиент каждого нейрона к его весу, но необходимо аккумулировать градиент всех нейронов на одном и том же глубинном срезе к весу, чтобы получить градиент к общему весу. Таким образом, для каждого среза обновляется только один набор весов.
Все веса в срезе глубины используют один и тот же вектор весов, тогда прямое распространение сверточного слоя в каждом срезе глубины можно рассматривать как вычисление свертки весов нейронов и объема входных данных (это «объем»). имя «Слой»). Вот почему эти наборы весов всегда называются фильтрами (или ядрами), потому что они свернуты с входными данными. На следующем рисунке динамически показан процесс свертки:
1.2.2 Слой объединения
Обычно объединяющий слой периодически вставляется между последовательными сверточными слоями. Его функция заключается в постепенном уменьшении пространственного размера объема данных, чтобы можно было уменьшить количество параметров в сети, снизить потребление вычислительных ресурсов и эффективно контролировать переоснащение. Слой пула использует операцию Max для независимой работы с каждым срезом глубины объема входных данных, изменяя его пространственный размер. Наиболее распространенная форма заключается в том, что объединяющий слой использует фильтр размером 2x2, который понижает дискретизацию каждого среза глубины с шагом 2, отбрасывая 75% информации об активации. Каждая операция Max принимает максимум 4 числа (то есть некоторую область 2x2 в срезе глубины). Глубина остается прежней.
Формула расчета слоя пула:
Введите размер тела данных:
Слой пула имеет два гиперпараметра:
Размер тела выходных данных:
в:
Поскольку ввод представляет собой вычисление фиксированной функции, никакие параметры не вводятся. Нулевой отступ редко используется в слоях пула.
На практике уровень максимального пула обычно имеет только две формы: одна F=3, S=2, а другая чаще используется F=2, S=2. Объединение в пул для больших рецептивных полей также требует больших размеров пула и, как правило, нарушает работу сети.
Общий пул: помимо максимального пула, модуль пула может использовать другие функции, такие как средний пул или пул по норме L2. Среднее объединение использовалось исторически, но редко используется сейчас. Потому что практика показала, что эффект от максимального пула лучше, чем от среднего пула. Схематическая диаграмма слоя пула показана на следующем рисунке:
Обратное распространение: Просмотрите содержание обратного распространения, где обратное распространение функции может быть просто понято как передача градиента обратно только по наибольшему числу. Поэтому индекс самого большого элемента в пуле обычно записывается во время прямого распространения через уровень пула (иногда называемый коммутаторами), чтобы градиентная маршрутизация была эффективной во время обратного распространения.
1.2.3 Уровень нормализации
В архитектуре сверточных нейронных сетей было предложено множество различных типов слоев нормализации, иногда для достижения механизмов торможения, наблюдаемых в биологическом мозге. Но эти слои постепенно вышли из моды, поскольку практика показала, что их действие если и имело место, то крайне ограниченное.
1.2.4 Полносвязный слой
В полностью связанном слое нейроны полностью связаны со всеми активациями в предыдущем слое, как в этой обычной нейронной сети. Их активацией может быть сначала умножение матриц, а затем смещение.
1.3 Общие модели CNN
1.3.1 LeNet
Это первое успешное приложение сверточной нейронной сети, реализованное Яном Лекуном в 1990-х годах, используемое для распознавания рукописного шрифта и «Hello World» для обучения нейронных сетей. Схема структуры сети показана на следующем рисунке:
Слой C1: слой свертки, этот слой содержит 6 ядер свертки признаков, размер ядра свертки составляет 5 * 5, и тогда можно получить 6 карт признаков, а размер каждой карты признаков составляет 32-5+1=28.
Слой S2: это слой понижения дискретизации, использующий максимальный пул для понижения дискретизации, размер пула 2x2, поэтому мы можем получить 6 карт объектов размером 14x14.
Слой C3: слой свертки, этот слой содержит 16 ядер свертки признаков, размер ядра свертки по-прежнему 5x5, поэтому можно получить 16 карт признаков, а размер каждой карты признаков составляет 14-5+1=10.
Слой S4: уровень понижения дискретизации по-прежнему представляет собой максимальное объединение 2x2 с понижением дискретизации, в результате чего получается 16 карт объектов 5x5.
Слой C5: слой свертки, этот слой использует 120 ядер свертки 5x5 и, наконец, выводит 120 карт признаков 1x1.
После этого идет полносвязный слой, а затем классификация.
1.3.2 AlexNet
Значение Alexnet велико: он продемонстрировал эффективность CNN на сложных моделях, заставив нейронные сети сиять в области компьютерного зрения. Его реализовали Алекс Крижевский, Илья Суцкевер и Джефф Хинтон. AlexNet выиграла конкурс ImageNet ILSVRC в 2012 году, опередив второе место (коэффициент ошибок в первой пятерке 16%, второе место - 26% частота ошибок в первой пятерке). Структура этой сети очень похожа на LeNet, но она глубже и крупнее и использует сложенные сверточные слои для получения признаков (ранее обычно был только один сверточный слой, за которым следовал объединяющий слой). Структурная схема показана на следующем рисунке:
Детали каждого слоя показаны на следующем рисунке:
Входной размер AlexNet составляет 227x227x3.
Первый сверточный базовый слой состоит из 96 фильтров размером 11x11 с шагом 4. Выходной размер (227 -11)/4 +1 = 55, а глубина 64. Там порядка 11х11х3х6435 тысяч параметров.
Размер пула второго слоя составляет 3x3, а шаг равен 2, поэтому размер вывода равен (55-3)/2+1=27.
Это первый раз, когда используется ReLU, по крайней мере, первый раз, когда ReLU переносится вперед.
Используйте нормализацию данных, которая сейчас мало используется.
Используется много дополнений к данным.
1.3.3 ZFNet
Сеть, изобретенная Мэтью Зейлером и Робом Фергусом, выиграла конкурс ILSVRC 2013 и называется ZFNet (сокращение от Zeiler & Fergus Net). Он улучшает AlexNet, изменяя гиперпараметры в структуре, в частности увеличивая размер промежуточных сверточных слоев, уменьшая шаг и размер фильтра первого слоя. Они внесли некоторые корректировки параметров на основе экспериментов. Структурная схема показана на следующем рисунке:
1.3.4 VGGNet
VGGNet не имеет сумасшедших архитектурных решений и не делает много работы по установке количества и размера фильтров. Вся сеть VGG использует только ядра свертки 3*3, размер скользящего шага 2 и окно пула 2*2, размер скользящего шага 2. Установка этого параметра сохраняется на протяжении всего процесса. Ключевым моментом VGG является то, сколько слоев вы повторяете эту операцию, и, наконец, структура сети, заданная одним и тем же набором параметров, повторяется 16 слоев. Вероятно, этот слой был выбран потому, что они сочли его наиболее эффективным. Для каждой картинки требуется 200М памяти, и все параметры суммируются, и общее количество параметров в конечном итоге достигнет 140 миллионов.
Зачем использовать фильтр 3*3? 3*3 является наименьшим, который может захватить верхнее, нижнее, левое и центральное рецептивные поля, а несколько сверточных слоев 3*3 имеют большую нелинейность, чем сверточный слой фильтра большего размера. Когда размер шага равен 1, максимальная площадь рецептивного поля двух фильтров 3*3 составляет 5*5, а максимальная площадь рецептивного поля трех фильтров 3*3 составляет 7*7, что может заменить фильтр большего размера. размер Несколько сверточных слоев 3*3 имеют меньше параметров, чем фильтр большого размера.Предполагая, что входная и выходная карты объектов сверточного слоя имеют одинаковый размер 10, тогда имеется три фильтра 3*3.Количество сверточных слоев параметры равны 3*(3*3*10*10)=2700, потому что три фильтра 3*3 можно рассматривать как декомпозированный фильтр 7*7 (средний слой имеет нелинейную декомпозицию), но параметр сверточного слоя 7*7 составляет 7 * 7 * 10 * 10 = 4900 1 * 1 функция фильтра заключается в линейной деформации входной строки, не влияя на входные и выходные размеры, а затем выполняется нелинейная обработка через Relu для увеличения способности нелинейного выражения сети.
Минус VGGNet в том, что он потребляет больше вычислительных ресурсов и использует больше параметров.Схема структуры выглядит следующим образом:
1.3.5 GoogLeNet
VGGNet работает хорошо, но имеет большое количество параметров. Вообще говоря, самый прямой способ улучшить производительность сети — увеличить глубину и ширину сети, а это означает огромное количество параметров. Однако огромное количество параметров подвержено переобучению, что значительно увеличивает объем вычислений.
Общая статья считает, что принципиальным способом решения двух вышеуказанных недостатков является преобразование полных соединений и даже общих сверток в разреженные соединения. С одной стороны, связи реальной биологической нервной системы также разрежены, с другой стороны, в некоторых литературах показано, что для крупномасштабных разреженных нейронных сетей можно построить послойную структуру, анализируя статистические свойства значения активации и кластеризация сильно коррелированных выходов оптимальная сеть. Понимание "разреженной структуры соединения" такое. Используйте стекируемую сетевую структуру как "маленькую" и "разбросанную", насколько это возможно, чтобы изучить сложные задачи классификации. Причина, по которой Inception может повысить точность сети, может быть связана с наличием у нее нескольких ядер. разных масштабов, каждый масштаб ядра будет изучать разные функции, а функции, изученные этими разными ядрами, будут объединены на следующем уровне, что может лучше реализовать всестороннее глубокое обучение.
Обычная начальная структура показана на следующем рисунке:
Inception, реализованный путем уменьшения размерности, показан на рисунке ниже, уменьшая 256-мерность до 64-мерности, уменьшая количество параметров:
Почему в сети VGG так много параметров? Это потому, что он имеет два полносвязных слоя 4096 в конце. Сегеди усвоил урок и, чтобы сжать сетевые параметры GoogLeNet, отменил полносвязный слой. Полная структура GoogLeNet показана на следующем рисунке:
1.3.6 ResNet
Остаточная сеть, завершенная Хэ Юмином и его коллегами, не только выиграла ImageNet в 2015 году, но и выиграла немало соревнований, почти во всех важных соревнованиях первое место. В глубокой сетевой оптимизации есть хорошо известное препятствие: исчезающие и взрывающиеся градиенты. Это препятствие можно решить с помощью разумной инициализации и некоторых других методов, но по мере увеличения глубины сети точность насыщается и быстро снижается, явление, известное как деградация и широко распространенное в глубоких сетях, что указывает на то, что не все системы могут быть легко оптимизированы. .
Для плейнета, если просто увеличить количество сетевых слоев, толку будет мало. Как показано выше, на cifar-10 сплошная линия — частота ошибок на тестовом наборе, а пунктирная линия — частота ошибок на обучающем наборе. Мы видим, что сеть с более глубокими слоями имеет более высокий коэффициент ошибок, что является ненаучным.По логике вещей, сеть с более глубокими слоями имеет большую пропускную способность.Это потому, что мы недостаточно хороши в оптимизации параметров и не можем выбрать лучший параметр. Частота ошибок обучения и частота ошибок тестирования модели остаточной сети продолжают улучшаться с увеличением глубины сети. Обучение ResNet требует 2-3 недель обучения 8 GPU.
Для решения этой проблемы Хэ Юмин предложил концепцию глубокого остаточного обучения. Прежде всего, мы предполагаем, что требуемое отображение есть H(x).Благодаря приведенному выше наблюдению мы понимаем, что непосредственно найти H(x) не так просто, поэтому мы переходим к поиску остаточной формы H(x ) F(x) = H(x)-x, предполагая, что процесс нахождения F(x) проще, чем H(x), так что мы можем достичь нашей цели через F(x)+x, что является просто На картинке выше мы называем эту структуру остаточным блоком. Я полагаю, что у многих возникнут сомнения относительно второй гипотезы, а именно, почему F(x) получить легче, чем H(x), в статье это четко не объяснено. Однако такой вывод действительно можно сделать из результатов экспериментов впоследствии.
В ResNet есть эти интересные пропущенные соединения, как показано выше. При обратном распространении остаточной сети градиент не только течет назад через эти веса, но и через эти пропускные соединения.Эти пропускные соединения представляют собой аддитивную обработку, которая может рассеивать градиент и позволять градиенту течь к предыдущей части, поэтому вы можете тренироваться Некоторые черты очень близки к изображению.
Из статистики глубины и частоты ошибок алгоритма нейронной сети в ImageNet на рисунке ниже видно, что количество слоев нейронной сети становится все глубже и глубже, а частота ошибок становится все ниже и ниже.
2. Фактический бой Tensorflow
2.1 Сравнение фреймворков с открытым исходным кодом для глубокого обучения
Существует много фреймворков глубокого обучения, мы представляем только два фреймворка, которые здесь используются чаще:
Tensorflow: TensorFlow — это программная библиотека с открытым исходным кодом для численных вычислений с использованием графов потоков данных, программная библиотека с открытым исходным кодом для машинного интеллекта. TensorFlow имеет высококачественный код на уровне продукта, поддерживаемый мощными возможностями разработки и обслуживания Google, а общий дизайн архитектуры также очень хорош. Как гигантская компания, Google имеет гораздо больше ресурсов для инвестиций в исследования и разработки TensorFlow, чем университеты или отдельные разработчики.Предвидится, что будущее развитие TensorFlow будет быстрым, что может привести к тому, что структура глубокого обучения будет поддерживаться университетами или отдельными лицами. далеко позади. позади. TensorFlow — относительно высокоуровневая библиотека машинного обучения. Пользователи могут легко использовать ее для проектирования структур нейронных сетей без необходимости писать код на C++ или CUDA для эффективной реализации. TensorFlow также имеет встроенные компоненты верхнего уровня, такие как TF.Learn и TF.Slim, которые могут помочь быстро проектировать новые сети.Другой важной особенностью TensorFlow является его гибкая переносимость, которая позволяет легко развертывать один и тот же код в любой произвольной сети без модификация Количество процессоров или графических процессоров на ПК, серверах или мобильных устройствах. Помимо поддержки общих сетевых структур сверточной нейронной сети (CNN) и рекуррентной нейронной сети (RNN), TensorFlow также поддерживает глубокое обучение с подкреплением и другие ресурсоемкие научные вычисления (такие как решение уравнения в частных производных и т. д.).
Caffe: Caffe – это широко используемая среда глубокого обучения с открытым исходным кодом. До появления Tensorflow это был проект с наибольшим количеством звезд Github в области глубокого обучения. Основные преимущества Caffe: 1. Простота использования, структура сети определяется в виде конфигурационных файлов, и нет необходимости проектировать сеть с помощью кода. Скорость обучения высока, а компоненты являются модульными, что позволяет легко расширить их до новых моделей и учебных задач. Однако, когда Caffe был первоначально разработан, цель была только для изображений и не учитывала текст, речь или данные временных рядов.Поэтому Caffe очень хорошо поддерживает сверточные нейронные сети, но не особенно достаточно для временных рядов RNN, LSTM и т. д.
2.2 Построение среды Tensorflow
2.2.1 Операционная система
Tensorflow поддерживает работу в Windows, Linux и Mac. Среда, которую я создал, использует 64-разрядную версию Ubuntu 16.04. Tensorflow должен полагаться на среду python, здесь python3.5 используется как базовая версия python по умолчанию. Anaconda рекомендуется в качестве среды Python, поскольку она позволяет избежать многих проблем совместимости.
2.2.1 Установка Анаконды
Anaconda — это дистрибутив Python для научных вычислений с сотнями встроенных библиотек, которые часто использует Python, некоторые из которых могут быть библиотеками, зависящими от Tensorflow. Версия Anaconda для Python должна совпадать с версией Tensorflow, иначе возникнут проблемы. Здесь я скачал Anaconda3-4.2.0-Linux-x86_64.sh. воплощать в жизнь:
bash Anaconda3-4.2.0-Linux-x86_64.sh
Установите Anconda.После завершения установки программа предложит нам добавить бинарный путь Anaconda3 в .bashrc.Рекомендуется добавить его сюда, чтобы команда python автоматически использовала среду Anaconda Python3.5.
2.2.2 Установка Tensorflow
Tensorflow делится на версию для процессора и версию для графического процессора.Если на вашем компьютере установлена видеокарта NVIDIA, рекомендуется установить версию для графического процессора, что ускорит ваше обучение. Установка версии для процессора относительно проста, поэтому я не буду здесь вдаваться в подробности, а расскажу в основном об установке версии для графического процессора. Первое использование:
lspci | grep -i nvidia
Проверьте модель вашей видеокарты nvidia и перейдите кdeveloper.nvidia.com/cuda-gpusПроверьте, поддерживает ли ваша видеокарта cuda, только тот gpu, который поддерживает cuda, может установить версию tensorflow для gpu. Мой компьютер — GeForce 940M, поддерживающий cuda.
(1) Установите CUDA и cuDNN
Сначала загрузите соответствующую версию cuda на официальном сайте nvidia. Скачать здесь cuda_8.0.61_375.26_linux.run. Загрузка здесь будет относительно медленной, рекомендуется использовать загрузку Thunder. Перед установкой вам необходимо приостановить драйвер X-сервера NVIDIA, сначала используйте ctrl+alt+f2 для доступа к командному интерфейсу Ubuntu, если вы не можете войти, на некоторых компьютерах необходимо использовать fn+ctrl+alt+f2, а затем выполнить
sudo /etc/init.d/lightdm stop
Приостановить X-сервер. Затем выполните следующую команду для установки:
chmod u+x cuda_8.0.61_375.26_linux.runsudo ./cuda_8.0.61_375.26_linux.run
Сначала нажмите q, чтобы пропустить лицензию в начале, затем введите accept, чтобы принять протокол, а затем нажмите y, чтобы выбрать установку драйвера.В последующем выборе мы выбираем не устанавливать OpenGL, иначе может возникнуть проблема с зацикливанием входа в интерфейсе входа. Затем нажмите n, чтобы не устанавливать образцы.
Затем установите cuDNN. cuDNN — это высокооптимизированная реализация CNN и RNN в глубоком обучении, запущенная NVIDIA. Нижний слой использует множество передовых технологий и интерфейсов, поэтому производительность намного выше, чем у библиотек нейронных сетей на других графических процессорах. Сначала загрузите cuDNN с официального сайта, На этом этапе вам необходимо зарегистрировать учетную запись NVIDIA и дождаться проверки. воплощать в жизнь
cd /usr/local sudo tar -xzvf ~/Downloads/cudnn-8.0-linux-x64-v6.0.tgz
На этом установка cuDNN завершена.
(2) Установите Tensorflow
Скачайте соответствующую версию на github, вот tensorflow_gpu-1.2.1-cp35-cp35m-
Linux_x86_64.whl. Затем выполните следующую команду, чтобы завершить установку.
pip install tensorflow_gpu-1.2.1-cp35-cp35m-linux_x86_64.whl
2.2 Hello World-MINST Распознавание рукописных цифр
2.2.1 Использование линейной модели и классификатора softmax
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)print(mnist.train.images.shape, mnist.train.labels.shape)print(mnist.test.images.shape, mnist.test.labels.shape)print(mnist.validation.images.shape, mnist.validation.labels.shape)
sess = tf.InteractiveSession()
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
tf.global_variables_initializer().run()
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(1000)
train_step.run({x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))print(accu
2.2.2 Использование модели CNN
from tensorflow.examples.tutorials.mnist import input_dataimport tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial)def bias_variable(shape):
initial = tf.constant(0.1, shape=shape) return tf.Variable(initial)def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.global_variables_initializer().run()for i in range(10000):
batch = mnist.train.next_batch(50) if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g" % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
print("test accuracy %g" % accuracy.eval(feed_dict={x: mnist.test.images,
y_: mnist.test.labels, keep_prob: 1.0}))
3. Идентификация героя King Glory
В бизнес-сценарии Penguin E-sports необходимо идентифицировать героя, который в настоящее время используется якорем в King of Glory. Вот первая попытка использовать метод глубокого обучения для классификации, и используемая структура — Caffe.
3.1 Конструктивные особенности
Во-первых, подготовить данные для обучения, Нам нужно разработать функции, которые необходимо классифицировать в соответствии с бизнес-сценарием. Мы можем выбрать весь игровой экран, экран героя в игре или ключ навыка в качестве признака классификации, как показано на следующем рисунке. При использовании всего игрового экрана картинка содержит много неактуальных элементов, а характерная область, по которой можно идентифицировать героя, невелика. Использование скриншотов героев можно использовать как очевидную функцию, но поскольку каждый герой имеет несколько наборов скинов, подготовить данные сложно, и это повлияет на точность распознавания. Поэтому лучше использовать область ключа навыка в качестве признака классификации.
При разработке классификационных признаков они должны быть как можно более четкими, а признаки между разными категориями сильно различаются.
3.2 Сбор данных
Сбор и маркировка данных — утомительная, но важная задача, и одна и та же модель может иметь совершенно разные результаты при обучении на разных данных. Вот 15-минутная загрузка видео для разных героев на Youtube, а затем используйте следующую команду ffmpeg, чтобы захватить изображение области клавиши навыка и уменьшить ее размер.
ffmpeg -i videos/1/test.mp4 -r 1 -vf "crop=380:340:885:352,scale=224:224" images/1/test_%4d.png
Папка изображений набора данных показана на следующем рисунке. Нужно отфильтровать шумовые картинки, которые не содержат скилл-ключей и поместить их в папку 0. Папка 0 служит категорией фона, которая соответствует категории неузнанных героев.
Здесь каждая категория содержит около 1000-2000 изображений. Конечно, чем больше набор данных, тем лучше, и он охватывает как можно больше сцен, чтобы повысить способность модели к обобщению.
3.3 Обработка данных
После создания набора данных его необходимо преобразовать в формат, распознаваемый Caffe. Сначала используйте код Python в левой части рисунка ниже, чтобы сгенерировать изображения, содержащиеся в обучающем наборе и тестовом наборе.Созданные файлы показаны в правой части рисунка ниже, включая путь к изображению и классификацию. Тестовый набор составляет пятую часть всех изображений.
Затем преобразуйте изображение в данные в формате LMDB, и Caffe предоставляет инструменты, которые помогут нам преобразовать. Скрипт обработки показан на рисунке ниже.
3.4 Выбор модели
Шесть описанных выше моделей являются широко используемыми моделями классификации изображений.Здесь мы выбираем GoogLeNet в качестве модельной сети. Эти сетевые модели находятся в папке моделей проекта Caffe.Проверьте папку caffe/models/bvlc_googlenet.Файлы следующие:
3.4.1 solver.prototxt
Параметры, используемые для обучения модели, определены в папке Solver.prototxt, а конкретные значения параметров показаны на следующем рисунке:
3.4.2 train_val.prototxt
train_val.prototxt — это конкретное определение структуры сети GoogLeNet.Существует много сетевых файлов.Здесь представлена независимая структура сетевого уровня. Первый — это слой данных, параметры которого показаны на следующем рисунке:
3.4.2 train_val.prototxt
train_val.prototxt — это конкретное определение структуры сети GoogLeNet.Существует много сетевых файлов.Здесь представлена независимая структура сетевого уровня. Первый — это слой данных, параметры которого показаны на следующем рисунке:
Сверточный слой, слой ReLU и структура слоя пула показаны на следующем рисунке:
Структура уровня LRN показана на следующем рисунке:
Выпадающий слой и полносвязный слой показаны на следующем рисунке:
3.4.3 deploy.prototxt
Файл развертывания представляет собой сетевую структуру, используемую во время развертывания, и большая часть его содержимого аналогична файлу train_val.prototxt, но часть содержимого тестового слоя удалена.
3.5 Обучение модели
После того, как данные и модель готовы, можно обучить модель. Для начала обучения здесь вызывается следующий код:
caffe train -solver solver.prototxt
Вы можете добавить параметр -snapshot, чтобы продолжить обучение последней обученной модели.Журнал обучения показан на следующем рисунке:
Когда модель сходится или точность соответствует нашим требованиям, обучение можно остановить.
3.6 Отсечение модели
GoogLeNet сама по себе является относительно большой сетью, и мы можем адаптировать сеть в соответствии со своими потребностями. Слой LRN в GoogLeNet малоэффективен и его можно удалить, либо удалить некоторые сверточные слои, чтобы уменьшить количество слоев в сети.
3.7 finetuning
Когда наш объем данных относительно невелик, проще обучить все параметры сети. На данный момент мы можем решить эту проблему, обучая только определенные слои сети. Сначала измените имя полностью подключенного слоя в train_val.prototxt, то есть имена трех слоев, loss1/classifier, loss2/classifier и loss3/classifier, а также количество их выходных классификаций.По умолчанию 1000. , который нужно изменить на свой тип total. Таким образом, когда мы снова загрузим обученную модель, параметры этих трех слоев будут повторно инициализированы. Затем установите lr_mult всех остальных слоев в 0, чтобы параметры других слоев не менялись, и используйте предварительно обученные параметры. Загрузите bvlc_googlenet.caffemodel — параметры Google, обученные на ImageNet. Затем вызовите caffe train -solver Solver.prototxt -weights bvlc_googlenet.caffemodel для обучения.
Tips
Проблема локального минимума: выполнимый трюк состоит в том, чтобы уменьшить размер пакета в начале.
Взрыв потерь: скорость обучения снижается.
Потери не всегда сходятся: сомневайтесь, есть ли проблема с набором данных или меткой.
Переоснащение: увеличение данных, регуляризация, отсев, пакетная нормализация и стратегии ранней остановки.
Инициализация веса: общий xavier или gaussian.
Finetune: используя GoogLeNet или VGG, вы можете точно настроить существующие модели.
Справочная документация:
1. Эта статья в основном составлена из заметок курса CS231n,ссылка на китайский перевод,Ссылка на китайский публичный класс. Настоятельно рекомендую всем ознакомиться.
2. «Книга глубокого обучения» Йошуа Бенджио рекомендуется и заслуживает внимания.
3. «Машинное обучение» Чжоу Чжихуа подходит для начала работы с машинным обучением.
4. «Битва с Tensorflow» Практика Tensorflow хороша.
5.Учебник Стэнфордского университета по глубокому обучению.
Под редакцией Ли Тао
Связанное Чтение
Когда глубокое обучение встречается с автоматическим обобщением текста
Обзор алгоритмов сжатия и ускорения модели CNN
Эта статья была разрешена автором для публикации в сообществе Tencent Cloud Technology Community, укажите это при перепечатке.первоисточник