30 сен 2018
Всем привет, это мой второй пост о машинном обучении. Мы попытаемся построить модель классификатора изображений с нуля, используя керасы менее чем за 2 минуты (да, давайте посмотрим, сможем ли мы построить модель до того, как ваши кивки будут готовы: P)
Вместо того, чтобы сразу копаться в коде, давайте разберемся, что такое keras и чем он может быть полезен.
Керас
Keras - это высокоуровневый API нейронных сетей, написанный на Python и способный работать поверх TensorFlow, CNTK или Theano. Проще говоря, это не что иное, как оболочка поверх популярных библиотек машинного обучения, таких как tenorflow, CNTK или Theano.
Когда и зачем использовать керас?
Keras предоставляет простые API, которые можно использовать для построения модели без глубокого понимания. Как указано на официальном сайте, «Keras - это API, разработанный для людей, а не для машин.
Keras легко изучить, поэтому разработчикам проще создавать и опробовать различные модели, настроенные с разными гиперпараметрами, в кратчайшие сроки.
Это очень полезно в случаях, когда:
- Требуется построить доказательство концепции для данной проблемы.
- Чтобы выиграть соревнование за несколько дней.
В двух словах, прежде чем реализовывать или выбирать, какая модель лучше всего подходит для данной постановки задачи, вы можете использовать keras для создания и опробования различных типов моделей.
В этом уроке мы будем использовать keras для построения сверточной нейронной сети для классификации изображений (кошек или собак).
Подождите, что такое сверточная нейронная сеть?
Свёрточная нейронная сеть (CNN) - это нейронная сеть с глубокой прямой связью, которая в основном используется для анализа и классификации изображений. CNN состоит из входа, выхода и n-номеров скрытых слоев. Скрытый слой может состоять из сверточных слоев, слоя объединения и полностью связанных слоев.
Простая CNN - это последовательность уровней, и каждый уровень в CNN преобразует один объем активации в другой с помощью функции.
Описание каждого слоя:
- Входной слой: этот слой используется для передачи необработанной информации о пикселях изображения. Обычно необработанная информация о пикселях выглядит так [128 x 128 x 3], где 128 x 128 - ширина и высота изображения, а 3 - цветовой канал (RGB).
- Слой свертки: этот слой используется для вычисления выходных сигналов нейронов в этом слое / регионе.
- Уровень RELU: используется для применения функций активации к выходным данным предыдущего уровня.
- Уровень объединения: уровень объединения выполняет понижающую дискретизацию и уменьшает размерность данного входного изображения.
- Полностью связанный слой: используется для вычисления окончательной метки класса для данного изображения.
Хотите подробно прочитать CNN? Прочтите здесь
Выполнение
Поскольку теперь у нас есть приблизительное представление о CNN и он работает, давайте начнем писать код с использованием keras. Не забывайте запускать таймер.
Набор данных
Загрузите набор изображений кошек и собак с сайта kaggle. Перед реализацией модели мы будем использовать класс кера ImageDataGenerator для подготовки данных.
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img import numpy as np from keras.preprocessing import image train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255) training_set = train_datagen.flow_from_directory('dataset/train', target_size=(64,64), batch_size = 32, class_mode = 'binary')
test_set = test_datagen.flow_from_directory('dataset/test', target_size = (64, 64), batch_size = 32, class_mode = 'binary')
Начните с импорта пакетов keras
# import convolutional layer
from keras.layers import Conv2D
# used to build the model as a sequence
from keras.models import Sequential
# used for pooling
from keras.layers import MaxPooling2D
# used to flatten out the layers
from keras.layers import Flatten
# for fully connected layer
from keras.layers import Dense
Последовательная модель - это линейный набор слоев. Он берет список слоев и складывает их в порядке добавления. Мы будем использовать это для добавления слоев к модели.
# define a sequential model
model = Sequential()
Теперь мы добавляем сверточный слой. Сверточные слои (функция Conv2D) принимают 3 аргумента:
- Количество фильтров
- Размер фильтра т.е. 3x3
- Размер входного изображения (первые два значения представляют ширину и высоту соответственно, а третье значение - цветовой канал, т.е. 3 для RGB, 1 для серого)
# add the convolutional layer
model.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3)))
Функция активации определяет выход узла с учетом входа или набора входов. relu (линейные единицы Rectiier - наиболее широко используемые функции активации прямо сейчас, которые в основном используются для классификации изображений)
# add the relu activation function to the layer model.add(Activation('relu'))
Когда у нас есть сверточный слой, мы добавляем максимальный уровень объединения. Цель слоя объединения - уменьшить разрешение входных изображений.
Слой объединения изменяет размеры каждого входа с помощью операции MAX.
# add max pooling layer for dimensionality reduction model.add(MaxPooling2D(pool_size = (2, 2)))
В этой модели до сих пор используется 1 сверточный слой с функцией активации relu, за которым следует максимальный уровень объединения. Мы можем добавить больше таких слоев в модель, чтобы улучшить обучение, но для простоты мы будем использовать однослойную модель с питанием.
Теперь мы используем функцию кераса Flatten для выравнивания модели, то есть конвертируем наши 3D-карты объектов в 1D-векторы.
# flatten the model
model.add(Flatten())
Последние шаги включают добавление к модели полностью связанного слоя. Dense - это модуль, предоставляемый keras для добавления слоя FC в модель. Требуется количество узлов / единиц, которые должны присутствовать на скрытых слоях сети. Затем следует еще одна функция активации.
# add the FC layer along with relu activation function model.add(Dense(64))
model.add(Activation('relu'))
Теперь, чтобы повысить точность и уменьшить переоснащение, мы будем использовать слой исключения. Идея исключения состоит в том, чтобы отбросить некоторые узлы, чтобы сеть могла сосредоточиться на других функциях и избежать переобучения.
# add dropout to reduce data overfitting
model.add(Dropout(0.5))
# add another FC layer to the network
model.add(Dense(1))
# add activation function
model.add(Activation('sigmoid'))
Поскольку мы добавили в модель все слои, пришло время скомпилировать модель.
binary_crossentropy
для вычисления функции потерь модели, adam
оптимизатор для вычисления градиентного спуска и accuracy
метрика для оценки модели
# compile the model with the following configuration model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Теперь у нас есть скомпилированная модель. Мы будем использовать это для обучения набору данных изображения, который мы импортировали ранее.
- training_set: обучающий набор, используемый для обучения модели
- steps_per_epoch: количество шагов обучения за эпоху
- эпохи: эпоха - это эпоха, когда модель обучается на всех данных в обучающем наборе.
- validation_data: набор данных проверки
- validation_steps: шаги проверки
model.fit_generator(training_set, steps_per_epoch = 2000, epochs = 50, validation_data = test_set, validation_steps = 2000)
Предсказание кошки или собаки
test_image = image.load_img('dataset/train/cats/cat_01.jpg', target_size = (64, 64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = model.predict(test_image)
training_set.class_indices
if result[0][0] == 1:
prediction = 'dog'
else:
prediction = 'cat'
We have built an image classifier model in no time !! This shows how keras can be useful to build and test out different models in a quick time.