30 сен 2018

Всем привет, это мой второй пост о машинном обучении. Мы попытаемся построить модель классификатора изображений с нуля, используя керасы менее чем за 2 минуты (да, давайте посмотрим, сможем ли мы построить модель до того, как ваши кивки будут готовы: P)

Вместо того, чтобы сразу копаться в коде, давайте разберемся, что такое keras и чем он может быть полезен.

Керас

Keras - это высокоуровневый API нейронных сетей, написанный на Python и способный работать поверх TensorFlow, CNTK или Theano. Проще говоря, это не что иное, как оболочка поверх популярных библиотек машинного обучения, таких как tenorflow, CNTK или Theano.

Когда и зачем использовать керас?

Keras предоставляет простые API, которые можно использовать для построения модели без глубокого понимания. Как указано на официальном сайте, «Keras - это API, разработанный для людей, а не для машин.

Keras легко изучить, поэтому разработчикам проще создавать и опробовать различные модели, настроенные с разными гиперпараметрами, в кратчайшие сроки.

Это очень полезно в случаях, когда:

  1. Требуется построить доказательство концепции для данной проблемы.
  2. Чтобы выиграть соревнование за несколько дней.

В двух словах, прежде чем реализовывать или выбирать, какая модель лучше всего подходит для данной постановки задачи, вы можете использовать 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 аргумента:

  1. Количество фильтров
  2. Размер фильтра т.е. 3x3
  3. Размер входного изображения (первые два значения представляют ширину и высоту соответственно, а третье значение - цветовой канал, т.е. 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'])

Теперь у нас есть скомпилированная модель. Мы будем использовать это для обучения набору данных изображения, который мы импортировали ранее.

  1. training_set: обучающий набор, используемый для обучения модели
  2. steps_per_epoch: количество шагов обучения за эпоху
  3. эпохи: эпоха - это эпоха, когда модель обучается на всех данных в обучающем наборе.
  4. validation_data: набор данных проверки
  5. 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.

использованная литература