Предыдущая статья достигла примерно 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 г.