Руководство от начала до конца по созданию глубоких нейронных сетей в Керасе

Все, от увеличения изображения до точности построения

Изучение глубокого обучения - непростая задача; поэтому полезны библиотеки, такие как Keras, которые упрощают работу. В этой статье я обрисовываю, объясняю и предоставляю код для 7 шагов в построении глубокой сверточной нейронной сети распознавания изображений в Keras.

1 | Загрузка данных изображения и базовая предварительная обработка

Изображения (в большинстве случаев) будут в формате .png или .jpg. Их можно загрузить с помощью библиотеки cv2 с image = cv2.imread(file_directory).

В библиотеке cv2 есть удобный экспорт cv2 изображения в массив numpy, выполняемый через img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB). Это даст массив размеров (m, n, 3), где m и n - размеры изображения. 3 представляет глубину или количество красного, зеленого и синего, которые необходимо включить в окончательный цвет пикселя.

Наконец, данные должны быть масштабированы или выставлены по шкале от 0 до 1. Это улучшает производительность модели (математически нейронные сети лучше работают по шкале от 0 до 1). Это можно сделать с помощью x /= 255.

Когда все данные собраны, они должны быть в массиве измерений (x, m, n, 3), где x - количество выборок в вашем наборе данных.

Если значение y является категориальным, его можно легко закодировать с помощью to_categorical Кераса:

from keras.utils import to_categorical
y = to_categorical(y)

2 | Разделение на обучение и тестирование

На этом этапе мы воспользуемся инструментом sklearn для разделения данных на наборы для обучения и тестирования. Вы можете заменить test_size любым размером, который хотите использовать - это баланс между отсутствием достаточного количества обучающих данных для правильного обучения и отсутствием достаточного количества тестовых данных для правильной оценки производительности модели на новых данных.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

3 | Увеличение данных с помощью ImageDataGenerator

Часто использование увеличения данных для небольшого изменения изображения может помочь модели глубокой нейронной сети узнать больше из набора данных и лучше обобщить.

from keras.preprocessing.image import ImageDataGenerator

Это импортирует объект ImageDataGenerator. Теперь его можно инициализировать параметрами того, как изображение должно быть увеличено (то, как вы управляете своими параметрами, зависит от контекста. Например, изображение, которое нужно дополнить для распознавания лиц, должно быть более консервативным с эффектами резкого искажения. ).

datagen = ImageDataGenerator(
     featurewise_center=True,
     featurewise_std_normalization=True,
     rotation_range=20,
     width_shift_range=0.2,
     height_shift_range=0.2,
     horizontal_flip=True)

Генератор данных может быть оснащен

datagen.fit(X_train)

Наконец (немного забегая вперед), во время обучения модель можно обучить на datagen.flow(), который представляет собой итератор Keras, который предоставляет дополненные изображения непосредственно модели.

model.fit_generator(datagen.flow(X_train, y_train, batch_size=size),                     steps_per_epoch=len(X_train) / size, epochs=epochs)

4 | Построение модельной архитектуры

Все модели Keras начинаются с их инициализации:

from keras.models import Sequential
model = Sequential()

Отсюда можно легко добавлять новые слои с помощью model.add():

from keras.layers import Conv2D
model.add(Conv2D(32, (5, 5), input_shape=(150, 150, 3))

Каждый первый слой модели, независимо от типа, должен иметь параметр input_shape, который сообщает модели форму изображения. В этом случае input_shape следует заменить любой формой изображения, с которым вы работаете.

Полное руководство по слоям Keras и их функциям можно найти в этой статье.

Большинство архитектур сверточных нейронных сетей состоят из нескольких ячеек, которые обычно состоят из сверточного слоя, слоя объединения, слоя активации и слоя исключения:

model.add(Conv2D(32, (5,5))
model.add(MaxPooling2D(pool_size=(2,2))
model.add(Activation('relu'))
model.add(Dropout(0.25))

Однако ячейки могут чередоваться на уровне (возможно, нечетные ячейки состоят только из сверточных, объединяющих и активационных слоев, и даже ячейки состоят из сверточных, объединяющих и выпадающих слоев).

После нескольких ячеек обобщения данные обычно преобразуются из двумерного массива в одномерный массив и проходят через плотные слои (стандартные слои искусственной нейронной сети).

Выбор архитектуры модели зависит от контекста набора данных.

Для более точного понимания количества параметров и формы входных данных, передаваемых на уровень, model.summary() распечатывает общее количество параметров и форму данных при их прохождении через изображение, чтобы помочь принять архитектурные решения на основе времени обучения.

5 | Скомпилируйте модель

После того, как архитектура модели определена, модель должна быть скомпилирована с оптимизатором и функцией потерь. Также есть возможность указать показатели, которые можно будет построить позже.

model.compile(optimizer='adam',loss='categorical_crossentropy',
metrics=['mae','mse']

Чтобы узнать о различных типах оптимизаторов моделей и о том, как их выбрать, нажмите здесь. Также здесь можно найти статью о том, какие функции потерь выбрать.

Adam - это часто используемый оптимизатор, который должен использоваться по умолчанию, если не тренирует нейронную сеть специально для целей импорта. Функция потерь также обычно представляет собой перекрестную энтропию, которая имеет множество форм - категориальная перекрестная энтропия для категориальных значений y, двоичная перекрестная энтропия для двоичных значений y и разреженная категориальная перекрестная энтропия. для категориальных значений y с большим количеством классов.

6 | Подгонка модели

Примерка модели проста. Обучающие наборы X_train и y_train, а также разделение валидации (сколько X_train берется за каждую эпоху, чтобы измерить, насколько хорошо модель обобщает невидимые данные), количество эпох (количество раз, когда модель проходит все набор данных) и размер пакета (как могут обрабатываться обучающие примеры за один раз).

history = model.fit(X_train, y_train, validation_split=0.25, epochs=50, batch_size=16)

Если бы вы использовали увеличение изображения, тренировка была бы

model.fit_generator(datagen.flow(X_train, y_train, batch_size=size),                     steps_per_epoch=len(X_train) / size, epochs=50)

Сохраняя его в истории, мы можем отображать его показатели с течением времени.

7 | Построение графика прогресса модели во время обучения

История сохраняется в переменной history, данные которой можно извлечь с помощью history.history[metric]. К любым метрикам, которые вы включили при компиляции модели, можно получить доступ, а также к включенным метрикам, например потерям.

plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) 
plt.title('Model Loss') 
plt.ylabel('Loss') 
plt.xlabel('Epochs') 
plt.legend(['Train', 'Test'], loc='upper right') 
plt.show()

Спасибо за прочтение!

Модель не доработана - нужен интерфейс! По-настоящему завершите модель, создав интерактивный интерфейс для создания изображений, чтобы использовать вашу модель здесь.