4. Построение более сложной CNN с использованием нескольких слоев

Задача: Углубленная классификация изображений

Для углубленной классификации изображений с использованием более сложной сверточной нейронной сети (CNN) важно использовать несколько слоев, включая сверточные слои, слои подвыборки (pooling), а также полносвязные слои. Рассмотрим пример такой сети на языке Python с использованием библиотеки TensorFlow и Keras.

Шаги:

1. Импорт библиотек и модулей.

2. Подготовка данных.

3. Построение модели CNN.

4. Компиляция и обучение модели.

5. Оценка и тестирование модели.

Пример кода:

```python

import tensorflow as tf

from tensorflow.keras import datasets, layers, models

import matplotlib.pyplot as plt

# Шаг 1: Импорт библиотек

import tensorflow as tf

from tensorflow.keras import datasets, layers, models

# Шаг 2: Подготовка данных

# Загрузка и нормализация данных CIFAR-10

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

train_images, test_images = train_images / 255.0, test_images / 255.0

# Шаг 3: Построение модели

model = models.Sequential()

# Первый сверточный слой

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))

model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.MaxPooling2D((2, 2)))

model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# Добавление полносвязных слоев

model.add(layers.Flatten())

model.add(layers.Dense(64, activation='relu'))

model.add(layers.Dense(10))

# Шаг 4: Компиляция и обучение модели

model.compile(optimizer='adam',

loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),

metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10,

validation_data=(test_images, test_labels))

# Шаг 5: Оценка модели

test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

print(f'\nТочность на тестовых данных: {test_acc}')

# Визуализация процесса обучения

plt.plot(history.history['accuracy'], label='Точность на обучающем наборе')

plt.plot(history.history['val_accuracy'], label='Точность на валидационном наборе')

plt.xlabel('Эпоха')

plt.ylabel('Точность')

plt.legend(loc='lower right')

plt.show()

```

Пояснение:

1. Импорт библиотек: Загружаются необходимые библиотеки TensorFlow и Keras для построения и обучения модели.

2. Подготовка данных: Загрузка набора данных CIFAR-10, который содержит 60,000 цветных изображений размером 32x32, разделенных на 10 классов. Данные нормализуются, чтобы ускорить обучение.

3. Построение модели: Модель создается как последовательная (Sequential). Добавляются несколько сверточных слоев, за которыми следуют слои подвыборки (Pooling) и полносвязные слои.

4. Компиляция и обучение: Модель компилируется с использованием оптимизатора Adam и функции потерь Sparse Categorical Crossentropy. Затем модель обучается на тренировочных данных.

5. Оценка и тестирование: После обучения модель оценивается на тестовых данных, и визуализируется точность на тренировочном и валидационном наборах данных.

Эта структура сети может быть расширена и усложнена в зависимости от задачи и доступных данных.


Построение модели

Создание последовательной модели (Sequential)

Для создания сложной сверточной нейронной сети (CNN) мы будем использовать последовательную модель `Sequential` из библиотеки Keras. Этот тип модели позволяет добавлять слои один за другим, что упрощает процесс построения и настройки сети.

Добавление сверточных слоев

Сверточные слои (Conv2D) являются основным элементом CNN. Они применяют фильтры к входному изображению, чтобы выделить различные признаки, такие как края, текстуры и другие важные детали. В нашем примере мы добавляем три сверточных слоя:

1. Первый сверточный слой:

```python

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))

```

– 32 фильтра: Каждый фильтр будет извлекать определенный признак из изображения.

– Размер фильтра 3x3: Это небольшой размер, который хорошо подходит для выделения мелких деталей.

– Функция активации ReLU: Rectified Linear Unit (ReLU) помогает сети обучаться нелинейным отношениям между признаками.

– input_shape=(32, 32, 3): Указываем форму входных данных (32x32 пикселя, 3 цветовых канала).

2. Второй сверточный слой:

```python

model.add(layers.Conv2D(64, (3, 3), activation='relu'))

```

–64 фильтра: Увеличиваем количество фильтров, чтобы сеть могла извлекать более сложные признаки.

3. Третий сверточный слой:

```python

model.add(layers.Conv2D(64, (3, 3), activation='relu'))

```

– Дополнительный сверточный слой для дальнейшего выделения признаков.

Добавление слоев подвыборки (Pooling)

Слои подвыборки (MaxPooling2D) уменьшают размерность выходных данных от сверточных слоев, что снижает вычислительную сложность и помогает избежать переобучения. Они выбирают максимальное значение из каждого подмассива данных, тем самым сохраняя наиболее значимые признаки.

1. Первый слой подвыборки:

```python

model.add(layers.MaxPooling2D((2, 2)))

```

– Размер пула 2x2: Снижение размерности выходных данных в два раза по каждой оси.

2. Второй слой подвыборки:

```python

model.add(layers.MaxPooling2D((2, 2)))

```

– Дополнительный слой подвыборки для дальнейшего уменьшения размерности данных.

Добавление полносвязных слоев (Fully Connected Layers)

После извлечения признаков из изображений с помощью сверточных и подвыборочных слоев, мы используем полносвязные слои (Dense) для классификации. Эти слои соединяют каждый нейрон предыдущего слоя с каждым нейроном текущего слоя.

1. Приведение данных в одномерный вид:

```python

model.add(layers.Flatten())

```

– Преобразование многомерного выхода сверточных слоев в одномерный вектор.

2. Первый полносвязный слой:

```python

model.add(layers.Dense(64, activation='relu'))

```

– 64 нейрона: Обучение нелинейным комбинациям признаков.

3. Выходной полносвязный слой:

```python

model.add(layers.Dense(10))

```

– 10 нейронов: Каждый нейрон соответствует одному классу из 10 в наборе данных CIFAR-10.

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

Загрузка...