CNN - это класс нейронных сетей, которые используются для классификации изображений (например, кошки против собак), обнаружения объектов, распознавания изображений и т. Д.
CNN выполняет математическую операцию, известную как свертка, вместо общего умножения матриц по крайней мере в одном из своих слоев.
Архитектура сверточной сети
- Слой свертки
- Уровень объединения
- Полностью связанный слой
Хотя вы можете спроектировать довольно хорошую нейронную сеть, используя только слои свертки, архитектура большинства нейронных сетей имеет несколько объединяемых и полностью связанных слоев.
CNN в TensorFlow 2.0
Теперь посмотрим, как реализовать CNN в TensorFlow. Я собираюсь использовать CNN под названием AlexNet, эта архитектура выиграла конкурс ImageNet Large Scale Visual Recognition Challenge 2012.
Импорт библиотек
import numpy as np import os import tensorflow as tf from tensorflow import keras import matplotlib.image as img from os import listdir import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split
Загрузить изображения
dog_img=[] cat_img=[] dog_add='address of folder containing dog images' cat_add='address of folder containing dog images' add=[dog_add,cat_add] for i in add: for filename in listdir(i): image_data=img.imread(i + '/' + filename) if i==dog_add: dog_img.append(image_data) else: cat_img.append(image_data) #creating labels for images img_labels=[0]*len(dog_img)+[1]*len(cat_img) all_img=dog_img + cat_img labels={0:"Dogs" , 1:"Cat"}
Обратите внимание, что размер ввода для всех изображений RGB в AlexNet должен быть 256x256, а в случае изображений в градациях серого - 227x227.
Создание наборов для обучения и тестирования
X_train,X_test,y_train,y_test=train_test_split(all_img[:], img_labels[:],test_size=0.33) #converting X_test and X_train to numpy array (currently they are list) X_train = np.array(X_train) y_train = np.array(y_train) X_test=np.array(X_test) y_test=np.array(y_test)
train_test_split () - это функция в Выбор модели Sklearn для разделения массивов данных на два подмножества: для данных обучения и для данных тестирования. Благодаря этой функции вам не нужно вручную разделять набор данных.
Запуск модели
model=tf.keras.models.Sequential([ tf.keras.layers.Conv2D(96,(11,11),strides=4,activation='relu',input_shape=(227,227,3)), tf.keras.layers.MaxPool2D((3,3),strides=2), tf.keras.layers.Conv2D(256,(5,5),padding='same',activation='relu'), tf.keras.layers.MaxPool2D((3,3),strides=2), tf.keras.layers.Conv2D(384,(3,3),padding='same',activation='relu'), tf.keras.layers.Conv2D(256,(3,3),padding='same',activation='relu'), tf.keras.layers.MaxPool2D((3,3),strides=2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(9216,activation='relu'), tf.keras.layers.Dense(4096,activation='relu'), tf.keras.layers.Dense(4096,activation='relu'), tf.keras.layers.Dense(3,activation='softmax') ])
Здесь мы определяем архитектуру модели.
Последовательный API позволяет создавать модели слой за слоем. Последовательный () состоит из списка слоев, добавленных к модели.
Conv2D () - это слой, который создает ядро свертки, которое сворачивается с входом слоя для создания тензора выходных данных. При использовании этого слоя в качестве первого слоя в модели укажите аргумент ключевого слова input_shape, например input_shape = (256, 256, 3) для 256x256 изображений RGB
MaxPool2D () - это уровень объединения. Уровень объединения используется для уменьшения представления размера для ускорения процесса вычислений (здесь создается версия входного сигнала с более низким разрешением, которая все еще содержит большие или важные структурные элементы, без мелких деталей, которые могут быть не так полезны для задача) и Max Pooling означает, что на последующих уровнях используются только те функции, которые наиболее сильно запускают выходы.
Составление модели
model.compile(loss='sparse_categorical_crossentropy', optimizer='Adam',metrics=['accuracy'])
Compile () создаст объект Python, который будет строить CNN.
На этапах компиляции также предлагается определить функцию потерь и тип оптимизатора, который вы хотите использовать. Эти варианты зависят от проблемы, которую вы пытаетесь решить, вы можете найти лучшие методы, обычно читая литературу в этой области.
Сохранение модели
model_path='Address' model_dir=os.path.dirname(model_path) model_callback=tf.keras.callbacks.ModelCheckpoint(model_path, save_weights_only=True,verbose=1)
Прогресс модели можно сохранить во время и после тренировки. Это означает, что модель может возобновить работу с того места, на котором она остановилась, и избежать длительного обучения.
ModelCheckpoint () s оценивает модель после каждой эпохи. model_path (строка, путь для сохранения файла модели), save_weights_only (если True, то будут сохранены только веса модели, иначе будет сохранена полная модель),
Обучение модели
fitting=model.fit(X_train,y_train,epochs=200,validation_split=0.25, shuffle=True,use_multiprocessing=True,callbacks=[model_callback])
Итак, теперь нам нужно обучить нашу модель, чтобы параметры были настроены для обеспечения правильных выходных данных для заданного входа. Мы делаем это, подавая входные данные на входной уровень, а затем получая выход, затем мы вычисляем функцию потерь, используя выходные данные, и используем обратное распространение для настройки параметров модели. Это подгонит параметры модели к данным.
Мы установим параметры обучения в model.fit (), такие как обучающий набор (X_train и y_train), количество эпох (), validation_split (какой процент обучающего набора является нашим набором проверки), перемешивание ( для перетасовки примеров в обучающем наборе), use_multiprocessing (использовать ли несколько ядер во время обучения), обратные вызовы (сохранять модель после каждой эпохи)
Оценка модели
model.evaluate(X_test,y_test,use_multiprocessing=True)
model.evaluate () Возвращает значение потерь и значения показателей для модели в тестовом режиме. input (набор тестов X_test и y_test), use_multiprocessing (использовать ли несколько ядер во время обучения).
График потерь на обучение и валидацию за эпоху
import matplotlib.pyplot as plt val_loss = fitting.history['val_loss'] loss = fitting.history['loss'] epochs = range(len(loss)) plt.plot(epochs,loss) plt.title("Training Loss") plt.show() plt.plot(epochs,val_loss,'r') plt.title("Validation Loss") plt.show()
Загрузка предварительно натренированных весов
model.load_weights(checkpoint_path)
После того, как вы обучили свою модель и сохранили веса или вы получили предварительно обученные веса для модели, просто загрузите веса, не нужно их тренировать снова.
Обратите внимание, что архитектура модели, на которую вы загружаете веса, должна быть такой же, как и у модели, на которой эти веса были обучены.
Ссылки: