Предыдущая статья достигла примерно 79–80% точности проверочного набора. Теперь мы можем улучшить это, включив отсев, а также еще один сверточный слой 2D.

# Импорт библиотек и пакетов Keras

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.layers import Dropout
from keras import optimizers

# Инициализация CNN

classifier = Sequential()

# Шаг 1 — Свертка

classifier.add(Conv2D(32, (3, 3), input_shape = (128, 128, 3), activation = 'relu'))

# Шаг 2 — Объединение

classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Добавляем второй сверточный слой

classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Добавляем третий сверточный слой

classifier.add(Conv2D(64, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Шаг 4 — Сведение

classifier.add(Flatten())

# Шаг 5 — Полное соединение, сигмовидная активация, так как это бинарная проблема.

classifier.add(Dense(units = 64, activation = 'relu'))
classifier.add(Dropout(0.5))classifier.add(Dense(units = 1, activation = 'sigmoid'))

# Составление CNN с использованием оптимизатора Адама (адаптивная оценка момента) и бинарной функции кросс-энтропийных потерь с метрикой точности. Используется бинарная перекрестная энтропия, поскольку это проблема бинарной классификации кошки или собаки.

classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Часть 2 — Подгонка CNN к изображениям

from keras.preprocessing.image import ImageDataGenerator
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/training_set', target_size = (128, 128), batch_size = 32, class_mode = 'binary')
test_set = test_datagen.flow_from_directory('dataset/test_set',                                            target_size = (128, 128), batch_size = 32, class_mode = 'binary')
history = classifier.fit_generator(training_set,                     steps_per_epoch = 8000/32,epochs = 90, validation_data = test_set,                         validation_steps = 2000/32, workers=12, max_q_size=100)

Полный код в формате Github Gist находится здесь:

Точность проверки примерно через 20 эпох стабилизируется на уровне 87–88%.

После 90 эпох вывод выглядит следующим образом:

Чтобы попробовать эту модель на одном входном изображении кошки или собаки, используйте следующий код:

from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
# The local path to our target image
img_path = 'C:\\Users\\Ferhat\\Convolutional_Neural_Networks\\dataset\\single_prediction\\cat_or_dog_2.jpg'
# `img` is a PIL image of size 224x224
img = image.load_img(img_path, target_size=(128, 128))
# `x` is a float32 Numpy array of shape (224, 224, 3)
x = image.img_to_array(img)
# We add a dimension to transform our array into a "batch"
# of size (1, 224, 224, 3)
x = np.expand_dims(x, axis=0)
# Finally we preprocess the batch
# (this does channel-wise color normalization)
x = preprocess_input(x)
preds = classifier.predict(x)
training_set.class_indices
if preds[0][0] == 1:
    prediction = 'dog'
else:
    prediction = 'cat'

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

Глубокое обучение с помощью Python, Франсуа Шолле, Мэннинг, 2018 г.

Практическое машинное обучение с помощью Scikit-Learn и TensorFlow, Аурелион Герон, O’Reilly, 2017 г.

Адам: метод стохастической оптимизации, Дидерик П. Кингма, Джимми Ба, 2015 г.