В этой статье мы построим сверточную нейронную сеть, которая будет обучаться на тысячах изображений 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, ссылка приведена ниже:
И не стесняйтесь разветвлять и отправлять запросы на включение, если у вас есть какие-либо отличные изменения или предложения по коду, который я написал. Спасибо.