- Оригинальный адрес:Implementation of Convolutional Neural Network using Python and Keras
- Оригинальный автор:rubikscode
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:JohnJiangLA
- Корректор:Gladysgong Starrier
Вы когда-нибудь думали об этом? Как Snapchat распознает лица? Как беспилотные автомобили узнают, где дорога? Как вы уже догадались, они использовали сверточные нейронные сети, тип нейронной сети, специально разработанный для компьютерного зрения. существуетпредыдущий пост, мы посмотрели, как они работают. Мы обсудили слои этих нейронных сетей и их функции. По сути, дополнительные слои сверточной нейронной сети будут обрабатывать изображение в стандартный формат, который может поддерживать нейронная сеть. Первым шагом в этом является обнаружение определенных функций или атрибутов, что выполняется с помощью сверточных слоев.
Этот слой использует фильтры для обнаружения объектов низкого уровня (таких как края и кривые) и объектов более высокого уровня (таких как лица и руки). Затем сверточная нейронная сеть использует дополнительные слои для устранения линейных искажений изображения, которые могут привести к переоснащению. Когда линейная интерференция удалена, дополнительные слои уменьшают размер изображения и уменьшают размерность данных. Наконец, эта информация передается в нейронную сеть, которая называется полносвязным слоем в сверточной нейронной сети. Опять же, целью этой статьи является то, как реализованы эти слои, поэтому более подробную информацию о том, как работают эти дополнительные слои и для чего они используются, можно найти впредыдущий постнайти в.
Прежде чем мы начнем устранять неполадки и запускать код, правильно настройте среду. иэта серияКак и во всех предыдущих статьях, я буду использовать Python 3.6. Кроме того, я использую Anaconda и Spyder, но вы можете использовать и другие IDE. Затем, самое главное, установите Tensorflow и Keras. Инструкции по установке и использованию Tensorflow см.здесь, а инструкции по установке и использованию Keras см.здесь.
Набор данных MNIST
Поэтому в этой статье мы будем обучать нашу сеть распознавать цифры на изображениях. Для этого мы будем использовать другой известный набор данных — набор данных MNIST. в предшественникеNISTОснованный на , этот набор данных состоит из обучающего набора из 60 000 образцов и тестового набора из 10 000 изображений рукописных цифр. Все числа нормализованы по размеру и центрированы. Размер изображений также фиксирован, поэтому предварительная обработка данных изображения была минимальной. Вот почему этот набор данных так популярен. Это считается примером «Hello World» в мире сверточных нейронных сетей.
Пример набора данных MNIST
Более того, используя сверточные нейронные сети, мы можем получить результаты, сравнимые с человеческими суждениями. В настоящее время этот рекорд принадлежит Параллельному вычислительному центру (Хмельницкий, Украина). Они использовали только ансамбль из 5 сверточных нейронных сетей и сохранили уровень ошибок на уровне 0,21%. Круто, правда?
Импорт библиотек и данных
иэта серияКак и в предыдущей статье, сначала импортируем все необходимые библиотеки. Некоторые из них нам знакомы, но некоторые из них требуют дополнительного пояснения.
Как видите, мы будем использовать numpy — библиотеку, которую мы использовали для работы с многомерными массивами и матрицами в предыдущих примерах. Также, как видите, мы будем использовать некоторыеэта серияФункции, которые использовались в библиотеке Keras ранее, также будут использовать некоторые новые функции. Например, при создании моделей и стандартных слоев (например, полносвязных слоев) будет использоватьсяSequentialиDense.
Кроме того, мы будем использовать некоторыеKerasновый класс в .Conv2Dэто класс, используемый для создания сверточных слоев.MaxPooling2Dэто класс, используемый для создания слоя пула, иFlatten— класс, используемый для уменьшения размерности. мы также используемKeras utilсерединаto_categorical. Этот класс используется для преобразования вектора (целого числа) в матрицу двоичной категории, т.е. он используется дляоднократное кодирование. Наконец, обратите внимание, что мы будем использоватьmatplotlibдля отображения результатов.
После импорта необходимых библиотек и классов нам нужно обработать данные. К счастью, Keras предоставляет набор данных MNIST, поэтому нам не нужно его загружать. Все эти изображения были частично предварительно обработаны, как упоминалось ранее. Это означает, что они имеют одинаковый размер и числа находятся в правильных местах. Итак, давайте импортируем этот набор данных и подготовим данные для нашей модели:
Как видите, мы импортировали набор данных MNIST из набора данных Keras. Затем мы загружаем данные в обучающие и тестовые матрицы. На этой основе размерность изображения получается с использованием атрибута формы, а входные данные реконструируются для получения канала входного изображения. По сути, мы используем только один канал этого изображения вместо обычных трех каналов (RGB). Это сделано для упрощения сложности реализации. Затем нормализуйте данные во входной матрице. Наконец, мы используемto_categoricalЗакодируйте выходную матрицу.
Создание модели
Теперь, когда данные готовы, мы можем приступить к самой интересной части — созданию модели:
Конечно, нам нужно использоватьSequential, и сначала добавьте сверточный слой, используя класс Conv2D. Как видите, этот класс использует очень мало параметров, так что давайте рассмотрим его вместе. Первый параметр — это количество используемых фильтров, то есть количество обнаруживаемых признаков. Обычно мы начинаем с 32 и постепенно увеличиваем это число. Это именно то, что мы делаем, в первом сверточном слое мы обнаруживаем 32 признака, 64 во втором слое и 128 в последнем третьем слое. Размер используемого фильтра определяется следующим параметром —kernel_sizeДля определения мы выбрали фильтр 3*3.
В функции активации мы используем функцию выпрямителя. Таким образом, степень нелинейности естественным образом возрастает в каждом сверточном слое. Другой способ добиться этого - использоватьkeras.layers.advanced_activationsсерединаLeakyReLU. Он не сжимает все значения ниже некоторого фиксированного значения до нуля, в отличие от стандартных функций сопоставления, а имеет небольшой отрицательный наклон. Если вы решите использовать его, обратите внимание, что вы должны использоватьConv2DЛинейная активация в . Вот пример такого подхода:
Мы немного не в тему. Вернемся к Conv2D и его параметрам. Еще одним очень важным параметром являетсяinput_shape. Используя этот параметр, определите размер входного изображения. Как уже упоминалось, мы используем только один канал, поэтому нашinput_shapeОкончательный размер равен 1. Это размер, который мы извлекаем из входного изображения.
Кроме того, мы добавили в модель дополнительные слои. Выпадающие слои могут помочь нам предотвратить переоснащение, после чего мы используемMasPooling2Dкласс, чтобы добавить объединяющий слой. Очевидно, что этот слой использует алгоритм максимального пула, а размер фильтра пула равен 2*2. За слоем объединения следует слой уменьшения размерности и, наконец, полностью связанный слой. Для финального полносвязного слоя мы добавили двухслойную нейронную сеть, для которой использовалиDenseсвоего рода. Наконец, мы скомпилировали модель и использовали оптимизатор Adam.
Если вы не понимаете некоторые из этих понятий, вы можете проверитьпредыдущая статья, что объясняет принципиальный механизм сверточного слоя. Кроме того, если у вас есть сомнения по поводу содержания Keras, тоэта статьяпоможет вам.
тренироваться
Отлично, наши данные предварительно обработаны, и наша модель построена. Ниже мы объединяем их вместе и обучаем нашу модель. Для того, чтобы то, что мы используем, работало должным образом. Мы передаем входную матрицу и определяемbatch_sizeиepochномер. Другая вещь, которую мы должны сделать, это определитьvalidation_split. Этот параметр используется для определения того, какую часть тестовых данных использовать в качестве данных проверки.
По сути, модель сохраняет часть обучающих данных, но использует эту часть данных для расчета потерь и других матриц модели в конце каждого цикла. Это отличается от тестовых данных, потому что мы используем их после каждого цикла.
После того, как наша модель обучена и готова, мы используемevaluateметод и пройти в тестовом наборе. Здесь мы можем получить точность этой сверточной нейронной сети.
предсказывать
Еще одна вещь, которую мы можем сделать, — это собрать прогнозы по нейронной сети в тестовом наборе данных. Таким образом, мы можем сравнить прогнозируемые результаты с фактическими результатами. Для этого мы будем использоватьpredictметод. Используя этот метод, мы также можем делать прогнозы для одного входа.
результат
Давайте используем эти прогнозы, которые мы только что собрали, чтобы завершить последний шаг нашей реализации. Мы покажем предсказанные числа в сравнении с фактическими числами. Мы также показываем изображение нашего предсказания. По сути, мы собираемся сделать хорошую визуализацию нашей реализации. Ведь мы имеем дело с изображениями.
Здесь мы использовалиpyplotчтобы показать десять изображений с фактическими результатами и нашими прогнозами. Когда мы запускаем нашу реализацию, она выглядит так:
Мы запустили 20 эпох и получили точность 99,39%. Неплохо, конечно есть куда расти.
в заключении
Сверточные нейронные сети — очень интересная ветвь компьютерного зрения и одна из самых влиятельных инноваций. В этой статье мы реализуем упрощенную версию этих нейронных сетей и используем ее для обнаружения цифр в наборе данных MNIST.
Спасибо за чтение!
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.