Сверточная нейронная сеть (CNN) — это тип нейронной сети, особенно полезный для задач классификации изображений. Я применил CNN к тысячам изображений Симпсонов, обучив классификатор распознавать 10 персонажей из телешоу с точностью более 90 процентов.

Получение набора данных

Вы можете скачать изображения с Kaggle. Набор данных содержит изображения для более чем 20 персонажей Симпсона. Я выбрал те, которые содержат не менее 1000 образцов изображений, и выбрал 10 символов для обучения моей модели.

Разделение изображений на обучающий и тестовый наборы

Все выбранные персонажи имеют тысячи образцов изображений. И я разделил их на 800 для тренировочного набора и 200 для тестового набора.

В папках training_set и test_set по 10 папок (по 1 на символ), содержащих 800 и 200 изображений соответственно.

И аналогично для test_set

Установка Tensorflow и Keras

Keras — очень хороший пакет Python для нейронных сетей. Чтобы использовать Keras, вам нужен tensorflow

Следуйте инструкциям на сайте Tensorflow для установки в зависимости от вашей ОС. Я установил версию GPU для более быстрого вычисления.

В машинном обучении сверточная нейронная сеть представляет собой класс глубоких искусственных нейронных сетей с прямой связью, которые успешно применяются для анализа визуальных образов. CNN используют разновидность многослойных персептронов, разработанных для минимальной предварительной обработки. Сверточные сети были вдохновлены биологическими процессами, в которых модель связи между нейронами вдохновлена ​​​​организацией зрительной коры животных.

CNN используют относительно небольшую предварительную обработку по сравнению с другими алгоритмами классификации изображений. Это означает, что сеть изучает фильтры, которые в традиционных алгоритмах создавались вручную. Эта независимость от предшествующих знаний и человеческих усилий при проектировании функций является большим преимуществом. У них есть приложения для распознавания изображений и видео, рекомендательных систем и обработки естественного языка.

Импорт библиотек

# Importing the Keras libraries and packages from keras.models import Sequential from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import Flatten from keras.layers import Dense from keras.preprocessing.image import ImageDataGenerator from timeit import default_timer as timer from keras.preprocessing import image import numpy as np import os

Настройка размера изображения

image_height = 128 image_width = 128

Я изменил размер всех своих изображений до 128x128. Вы можете выбрать размер больше или меньше в зависимости от вычислительной мощности вашей системы.

Построение нейронной сети

CNN состоит из входного и выходного слоев, а также нескольких скрытых слоев. Я построил 4 скрытых слоя для своей нейронной сети.

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

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

# Initialising the CNN predator = Sequential() # Step 1 - Convolution predator.add(Conv2D(64, (3, 3), activation="relu", input_shape=(image_height, image_width, 3))) # Step 2 - Pooling predator.add(MaxPooling2D(pool_size = (2, 2))) # Adding a second convolutional layer predator.add(Conv2D(128, (3, 3), activation="relu")) predator.add(MaxPooling2D(pool_size = (2, 2))) # Adding a third convolutional layer predator.add(Conv2D(256, (3, 3), activation="relu")) predator.add(MaxPooling2D(pool_size = (2, 2))) # Adding a fourth convolutional layer predator.add(Conv2D(128, (3, 3), activation="relu")) predator.add(MaxPooling2D(pool_size = (2, 2))) # Adding a fifth convolutional layer predator.add(Conv2D(64, (3, 3), activation="relu")) predator.add(MaxPooling2D(pool_size = (2, 2))) # Step 3 - Flattening predator.add(Flatten()) #flattens the 3D image array to a single row array # Step 4 - Full connection predator.add(Dense(units=32, activation="relu")) predator.add(Dense(units=10, activation="softmax")) #output layer with 10 neurons.. each corresponding to a character # Compiling the CNN predator.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

Определение набора для обучения и набора тестов

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

train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True) #ImageDataGenerator augments images, creating multiple versions of the same image test_datagen = ImageDataGenerator(rescale = 1./255) training_set = train_datagen.flow_from_directory('simpsons/training_set', target_size = (image_height, image_width), batch_size = 50, class_mode = 'categorical') test_set = test_datagen.flow_from_directory('simpsons/test_set', target_size = (image_height, image_width), batch_size = 50, class_mode = 'categorical')

Подгонка CNN к изображениям

predator.fit_generator(training_set, steps_per_epoch = 16, epochs = 100, validation_data = test_set, validation_steps = 4)

С этого начинается тренировочный процесс. Мне потребовалось около 10 минут для запуска 100 эпох, чтобы вернуть точность более 90 процентов.

Предсказание новой картинки

В наборе данных kaggle также есть независимая папка predict, содержащая около 500 изображений 10 символов.

# prediction on a new picture  result = [] path = 'simpsons/predict' files = os.listdir(path) for file in files: test_image = image.load_img('simpsons/predict/'+file, target_size=(image_height, image_width)) test_image = image.img_to_array(test_image) test_image = np.expand_dims(test_image, axis=0) pred = predator.predict_on_batch(test_image) result.append(pred) result = np.asarray(result)

Результаты

Неплохо :)

Создание CSV-файла с результатами

index = files import pandas as pd predictions = result[:, [0]][:,0] df = pd.DataFrame(index=index) df['bart'] = predictions[:,0] df['charles'] = predictions[:,1] df['homer'] = predictions[:,2] df['krusty'] = predictions[:,3] df['lisa'] = predictions[:,4] df['marge'] = predictions[:,5] df['milhouse'] = predictions[:,6] df['moe'] = predictions[:,7] df['ned'] = predictions[:,8] df['principal'] = predictions[:,9] df = df.astype(int) df.to_csv('simpsons/predictions.csv')

Сохраните обученную модель

Если вы довольны прогнозируемыми результатами, вы можете сохранить обученную модель с помощью приведенного ниже кода.

#save weight predator.save_weights('simpsons/blog/simpsons-CNN.hdf5')

Вы можете скачать мои тренировочные веса здесь.

Первоначально опубликовано на ashishkhan.com.