Классификация изображений с использованием набора данных CIFAR-10 и CIFAR-100 в TensorFlow
CIFAR10 и CIFAR100 — некоторые из известных эталонных наборов данных, которые используются для обучения CNN задаче компьютерного зрения.
В этой статье мы должны выполнить классификацию изображений для обоих этих наборов данных CIFAR10, а также CIFAR100, поэтому мы будем использовать трансферное обучение здесь.
Но как? Во-первых, мы создадим пользовательскую модель CNN и обучим ее на наших данных CIFAR100. А затем мы будем использовать обученные веса сверточных слоев для построения модели классификации для набора данных CIFAR10.
Импорт библиотек
Нам потребуются следующие библиотеки:
- ТензорФлоу
- Нампи
- Матплотлиб
Python3
import tensorflow as tffrom tensorflow import kerasfrom keras import layers import numpy as npimport matplotlib.pyplot as plt import warningswarnings.filterwarnings("ignore") |
Импорт набора данных
Теперь давайте сначала загрузим набор данных CIFAR100 с помощью TensorFlow API. Полученные данные уже разделены на наборы данных для обучения и проверки.
Python3
# Load in the datacifar100 = tf.keras.datasets.cifar100 # Distribute it to train and test set(x_train, y_train), (x_val, y_val) = cifar100.load_data()print(x_train.shape, y_train.shape, x_val.shape, y_val.shape) |
Выход:
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-100-python.tar.gz 169001437/169001437 [==============================] - 13s 0us/step (50000, 32, 32, 3) (50000, 1) (10000, 32, 32, 3) (10000, 1)
Это означает, что у нас есть 50 000 изображений формата RGB размеров (32 и 32) в обучающих данных. И около 10 000 изображений в наборе данных проверки.
Визуализация данных
Здесь, на этом этапе, мы визуализируем набор данных, это поможет нам улучшить модель.
Python3
def show_samples(data, labels): plt.subplots(figsize=(10, 10)) for i in range(12): plt.subplot(3, 4, i+1) k = np.random.randint(0, data.shape[0]) plt.title(labels[k]) plt.imshow(data[k]) plt.tight_layout() plt.show() show_samples(x_train, y_train) |
Выход:
Из-за очень маленького размера изображений их содержание не так ясно. Чтобы узнать, какое число представляет какой класс, можно обратиться к различным источникам, доступным в Интернете.
Разделение данных
Нам нужно разделить данные на обучение и проверку.
Python3
y_train = tf.one_hot(y_train, depth=y_train.max() + 1, dtype=tf.float64)y_val = tf.one_hot(y_val, depth=y_val.max() + 1, dtype=tf.float64) y_train = tf.squeeze(y_train)y_val = tf.squeeze(y_val) |
Архитектура модели
Теперь давайте определим архитектуру модели, которую мы будем использовать в качестве нашей CNN для классификации этих 100 классов.
Python3
model = tf.keras.models.Sequential([ layers.Conv2D(16, (3, 3), activation="relu", input_shape=(32, 32, 3), padding="same"), layers.Conv2D(32, (3, 3), activation="relu", padding="same"), layers.Conv2D(64, (3, 3), activation="relu", padding="same"), layers.MaxPooling2D(2, 2), layers.Conv2D(128, (3, 3), activation="relu", padding="same"), layers.Flatten(), layers.Dense(256, activation="relu"), layers.BatchNormalization(), layers.Dense(256, activation="relu"), layers.Dropout(0.3), layers.BatchNormalization(), layers.Dense(100, activation="softmax")]) model.compile( loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True), optimizer="adam", metrics=["AUC", "accuracy"]) |
Какие изменения вносятся в изображения при углублении в сеть, которые можно визуализировать с помощью сводки модели? Он также показывает количество параметров, которые будут обучаться в этой модели.
Python3
model.summary() |
Выход:
Примерка модели
Подгонку модели можно выполнить с помощью приведенного ниже кода.
Python3
hist = model.fit(x_train, y_train, epochs=5, batch_size=64, verbose=1, validation_data=(x_val, y_val)) |
Выход:
Использование модели для обучения CIFAR10
Теперь мы будем использовать слои свертки этой модели для построения нашего классификатора CIFAR10.
Python3
temp = model.get_layer("conv2d_3")last_output = temp.outputlast_output.shape |
Выход:
TensorShape([None, 16, 16, 128])
Теперь реализуем функциональную модель, которая будет использовать выходные данные предыдущей модели и учиться на ее основе.
Python3
x = layers.Flatten()(last_output) x = layers.Dense(256, activation="relu")(x)x = layers.BatchNormalization()(x) x = layers.Dense(256, activation="relu")(x)x = layers.Dropout(0.3)(x)x = layers.BatchNormalization()(x) output = layers.Dense(10, activation="softmax")(x) model_new = keras.Model(model.input, output) |
Давайте проверим сводку этой новой модели.
Python3
model_new.summary() |
Выход:
Теперь давайте скомпилируем модель с теми же потерями, оптимизатором и метриками, что и в классификаторе CIFAR100.
Python3
model_new.compile( loss="categorical_crossentropy", optimizer="adam", metrics=["AUC", "accuracy"]) |
Итак, мы подготовили новую модель, которая теперь готова к обучению на наборе данных CIFAR10. Давайте также загрузим эти данные с помощью TensorFlow API.
Python3
# Load in the datacifar10 = tf.keras.datasets.cifar10 # Distribute it to train and test set(x_train, y_train), (x_val, y_val) = cifar10.load_data()print(x_train.shape, y_train.shape, x_val.shape, y_val.shape) |
Выход:
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 170498071/170498071 [==============================] - 14s 0us/step (50000, 32, 32, 3) (50000, 1) (10000, 32, 32, 3) (10000, 1)
Python3
y_train = tf.one_hot(y_train, depth=10, dtype=tf.float64)y_val = tf.one_hot(y_val, depth=10, dtype=tf.float64) y_train = tf.squeeze(y_train)y_val = tf.squeeze(y_val) |
Теперь мы будем обучать нашу модель.
Python3
history = model_new.fit(x_train, y_train, batch_size=64, epochs=5, verbose=1, validation_data=(x_val, y_val)) |
Выход:
Вывод
Обучая модель для большего количества эпох, можно получить наилучшие результаты.