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

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

  • Загрузка и предварительная обработка собственного набора данных
  • Проектирование и обучение модели CNN в Keras
  • Построение кривой потерь и точности
  • Оценка модели и прогнозирование выходного класса тестового изображения
  • Визуализация вывода промежуточного слоя CNN
  • Построение матрицы путаницы для вашего результата

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

Набор данных, который мы будем использовать, включает 7 классов, собранных из Интернета и помеченных.

PATH = os.getcwd()

#Define data path
data_path = PATH + '/data'
data_dir_list = os.listdir(data_path)
data_dir_list

Вышел[43]:

['bike', 'cars', 'cats', 'dogs', 'flowers', 'horses', 'human']
PATH = os.getcwd()

#Define data path
data_path = PATH + '/data'
data_dir_list = os.listdir(data_path)
data_dir_list

Вышел[43]:

['bike', 'cars', 'cats', 'dogs', 'flowers', 'horses', 'human']

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

#Visualize some images
image = X_train[1441,:].reshape((128,128))
plt.imshow(image)
plt.show()

Затем мы начинаем проектировать и компилировать модель CNN в Keras.

#Initializing the input shape
input_shape = img_data[0].shape

#Design CNN sequential model
model = Sequential ([
    Convolution2D(32,3,3, border_mode = 'same', activation = 'relu', input_shape = input_shape),
    Convolution2D(32,3,3, activation = 'relu'),
    MaxPooling2D(pool_size = (2,2)),
    Dropout(0.5),
    
    Convolution2D(64,3,3, activation = 'relu'),
    MaxPooling2D(pool_size = (2,2)),
    Dropout(0.5), 
    
    Flatten(),
    Dense(64, activation = 'relu'),
    Dropout(0.5),
    Dense(num_classes, activation = 'softmax')
])
#Compiling the model
model.compile(
    loss = 'categorical_crossentropy', 
    optimizer = 'adadelta',
    metrics = ['accuracy'])

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

ist = model.fit (X_train, y_train,
                     batch_size = 16,
                     nb_epoch = num_epoch,
                     verbose=1,
                     validation_data = (X_test, y_test)
                     )

Теперь мы можем использовать нашу модель для прогнозирования нового класса для нового изображения, используя приведенный ниже код:

# Predicting the test image
print((model.predict(test_image)))
print('Image class:', model.predict_classes(test_image))

Как мы видим ниже, наша модель правильно относит изображение к классу [0] — велосипед.

[[3.6560327e-01 2.7960737e-06 1.2630007e-03 2.9311934e-01 1.6894026e-02
  3.0998811e-01 1.3129448e-02]]
Image class: [0]

Вот матрица путаницы без нормализации

Теперь мы можем сохранить модель и веса для реализации в реальном приложении.

Пожалуйста, обратитесь к полному коду в моем репозитории GitHub, ссылка приведена ниже:



И не стесняйтесь разветвлять и отправлять запросы на включение, если у вас есть какие-либо отличные изменения или предложения по коду, который я написал. Спасибо.