Глубокое обучение для новичков [Часть 1]

Глубокое обучение в течение некоторого времени находится на подъеме. В последнее время люди начали использовать глубокое обучение во многих областях. Если вы хотите сразу погрузиться в код, перейдите во 2-ю часть.

В этой серии вы научитесь решать простую задачу по обнаружению одного объекта (например, кошки или собаки) на изображении. В ходе этого решения вы узнаете об одном типе глубокого обучения. Вы также сможете кодировать в Keras и Tensorflow, двух известных библиотеках, использующих эту технологию. Я не буду говорить о математике, лежащей в основе глубокого обучения. Сериал состоит из двух частей. В первой части рассказывается об основах глубокого обучения и подводных камнях. Во второй части серии мы рассмотрим, как создавать свои собственные модели в Керасе.

Прежде чем мы начнем, я представлюсь. Я специалист по информатике, в настоящее время работаю в @ Practo. Раньше я работал над играми на платформе Facebook (когда это было так), а позже над мобильными играми.

Так что же такое глубокое обучение? Почему он называется Deep? Действительно ли система учится?

Начнем с истории. Глубокое обучение - это последнее классное слово для нейронных сетей, которое существует с 60-х годов. Если вы не знаете, что такое нейронная сеть, не беспокойтесь, я объясню в следующей части этой статьи. Примерно в 2006 году гениальный парень по имени Джеффри Хинтон вместе с другими выступил с докладом. В этой статье была интересная реализация одного типа нейронной сети. В 2012 году двое учеников Хинтона выиграли соревнование (ILSVRC), вдвое превзойдя его ближайших конкурентов. Это показало всему миру, что работа Хинтона может решать очень интересные задачи.

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

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

Нейронная сеть - это простая математическая формула, которая выглядит примерно так:

x * w = y

Предположим, что x - ваше входное изображение, а y - некоторый выход, который является классом, определенным сетью. x является постоянным, поскольку существует только фиксированный набор изображений. На выходе Network выдает y. Мы можем изменить только w. Мы называем w весом одного нейронного слоя. Процесс обучения состоит из двух частей: прямого и обратного распространения. В прямом проходе мы передаем изображения в сеть в качестве входных данных (x), и сеть генерирует некоторый выходной класс y ’. Насколько близко y ’к y - ошибка сети. При обратном распространении сеть пытается уменьшить ошибку, изменяя вес w. Многие термины называют w как гиперпараметр, ядро, фильтр. Проблема с нейронными сетями заключается в том, что все слои передают все данные с одного уровня на другой. Чтобы решить эту проблему, мы собираемся использовать сверточные нейронные сети. Так что же такое свертка? Посмотрим на это ниже.

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

Нейронные сети полностью подключены, что означает, что один нейронный слой передаст весь набор данных следующему уровню. Следующий уровень будет обрабатывать все данные и так далее и так далее. Это работает для простых изображений, таких как 8x8 или даже 36x36. Но практические изображения имеют размер 1024x768, поэтому это становится огромной вычислительной задачей. Изображения, как правило, по своей природе неподвижны. Это означает, что статистика одной части изображения такая же, как и любой другой части. Таким образом, функция, изученная в одной зоне, может выполнять аналогичное сопоставление с образцом в другой зоне. На большом изображении мы берем небольшой участок и пропускаем его через все точки на большом изображении. Проходя в любой точке, мы сворачиваем или объединяем их в единую позицию. Вместо этого попробуйте представить, что большой блок данных становится маленьким блоком данных для следующего слоя нейрона. Это помогает ускорить вычисления без потери точности данных. Каждый маленький участок изображения, который проходит поверх большого изображения, преобразуется в маленький фильтр. Позднее фильтры настраиваются на основе данных обратного распространения (мы вернемся к этому чуть позже).

Уровень объединения

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

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

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

Обратное распространение

Обратное распространение - это процесс, в котором мы пытаемся устранить ошибку. Под ошибкой я подразумеваю разницу в y и y '. Это поможет w соответствовать набору данных, который мы передали в сеть. . Мы выполняем обратное распространение, используя процесс градиентного спуска. Этот процесс пытается приблизить значение ошибки к нулю.

Что дальше?

Вышеупомянутой литературы в значительной степени достаточно, чтобы начать работу над прикладными #CNN. Когда вы застрянете на этапе реализации, вы сможете больше узнать об этой конкретной теме. Оставляйте вопросы в разделе комментариев, и я отвечу на них. На этом мы подошли к концу этой части серии. Вторая часть статьи закончена, и вы можете найти ссылку ниже.

Вторую часть серии вы можете найти по этой ссылке. Следите за мной в твиттере, и вы также можете подписаться на небольшой и нечастый список рассылки, который я поддерживаю. Если вам понравилась эта статья, нажмите кнопку ❤, чтобы порекомендовать ее. Это поможет другим пользователям Medium найти его.

Хакерский полдень - это то, с чего хакеры начинают свои дни. Мы часть семьи @AMI. Сейчас мы принимаем заявки и рады обсудить рекламные и спонсорские возможности.

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