0Pricing
R Academy · Урок

Основы свёрточных нейронных сетей

Добавляйте слои Conv2D и MaxPooling для задач классификации изображений

«Основы свёрточных нейронных сетей» — бесплатный урок R Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Зачем нужны CNN для изображений

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

library(keras)

# Images are 3D tensors: (height, width, channels)
# MNIST: (28, 28, 1) — grayscale
# CIFAR-10: (32, 32, 3) — RGB

# Reshape flat vectors into image tensors
mnist <- dataset_mnist()
x_train <- array_reshape(mnist$train$x / 255, c(-1, 28, 28, 1))
y_train <- to_categorical(mnist$train$y, 10)

cat('Input shape:', dim(x_train))

layer_conv_2d() — основной слой

layer_conv_2d(filters, kernel_size, activation) применяет к входным данным filters обучаемых двумерных ядер размера kernel_size. Каждый фильтр обучается обнаруживать определённый тип пространственной закономерности. Размерность выхода имеет вид (height, width, filters).

library(keras)

# First conv layer: 32 filters of 3x3
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
  layer_conv_2d(
    filters     = 32,
    kernel_size = c(3, 3),
    activation  = 'relu',
    padding     = 'same'  # keep spatial dimensions
  )

summary(model)  # output: (None, 28, 28, 32)

layer_max_pooling_2d()

layer_max_pooling_2d(pool_size) уменьшает пространственные размеры, выбирая максимальное значение в каждом окне объединения. Это даёт два результата: уменьшает количество параметров в следующих слоях и добавляет некоторую инвариантность к переносу (небольшие сдвиги не вызывают значительных изменений выхода).

model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
  layer_conv_2d(32, kernel_size = c(3, 3), activation = 'relu') |>
  layer_max_pooling_2d(pool_size = c(2, 2))

summary(model)
# After pooling: (None, 13, 13, 32)
# Spatial dims halved, channel count preserved

Объединение свёрточных слоёв

Более глубокие CNN объединяют несколько блоков Conv+Pool. Ранние слои обнаруживают низкоуровневые признаки (границы, градиенты), а глубокие объединяют их в высокоуровневые признаки (формы, объекты). Каждый слой Conv увеличивает количество фильтров, компенсируя уменьшение пространственных размеров.

model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
  layer_conv_2d(32, c(3, 3), activation = 'relu', padding = 'same') |>
  layer_max_pooling_2d(c(2, 2)) |>   # 16x16
  layer_conv_2d(64, c(3, 3), activation = 'relu', padding = 'same') |>
  layer_max_pooling_2d(c(2, 2)) |>   # 8x8
  layer_conv_2d(128, c(3, 3), activation = 'relu', padding = 'same') |>
  layer_max_pooling_2d(c(2, 2))      # 4x4

summary(model)

layer_flatten()

layer_flatten() преобразует трёхмерный выход последнего свёрточного блока (height, width, filters) в одномерный вектор. Это связующее звено между основой извлечения признаков (свёрточными слоями) и классификатором (полносвязными слоями).

model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
  layer_conv_2d(32, c(3, 3), activation = 'relu') |>
  layer_max_pooling_2d(c(2, 2)) |>
  layer_conv_2d(64, c(3, 3), activation = 'relu') |>
  layer_max_pooling_2d(c(2, 2)) |>
  layer_flatten() |>     # 3D -> 1D vector
  layer_dense(128, activation = 'relu') |>
  layer_dense(10, activation = 'softmax')

summary(model)

layer_dropout() в CNN

В CNN прореживание обычно применяют после слоя flatten и полносвязных слоёв, а не внутри свёрточных блоков (там предпочтительнее пространственное прореживание layer_spatial_dropout_2d()). После первого полносвязного слоя часто используют значение rate от 0.25 до 0.5.

model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
  layer_conv_2d(32, c(3, 3), activation = 'relu') |>
  layer_max_pooling_2d(c(2, 2)) |>
  layer_conv_2d(64, c(3, 3), activation = 'relu') |>
  layer_max_pooling_2d(c(2, 2)) |>
  layer_flatten() |>
  layer_dense(128, activation = 'relu') |>
  layer_dropout(rate = 0.5) |>    # regularise the classifier head
  layer_dense(10, activation = 'softmax')

summary(model)

Компиляция и обучение CNN

Компилируйте и обучайте CNN так же, как полносвязную сеть. Для классификации нескольких классов с метками в формате one-hot используйте 'categorical_crossentropy', а для целочисленных меток — 'sparse_categorical_crossentropy'. CNN часто лучше обучаются при немного меньшей скорости обучения, чем полносвязные сети.

model |> compile(
  optimizer = optimizer_adam(learning_rate = 0.0005),
  loss      = 'categorical_crossentropy',
  metrics   = c('accuracy')
)

history <- model |> fit(
  x = x_train,
  y = y_train,
  epochs     = 10,
  batch_size = 64,
  validation_split = 0.1,
  verbose = 1
)

plot(history)

Расширение данных

Обучение CNN на небольших наборах данных часто приводит к переобучению. Расширение данных искусственно увеличивает обучающую выборку, применяя во время обучения случайные преобразования (отражения, повороты, масштабирование). В keras3 используйте layer_random_flip() и layer_random_rotation() как слои предварительной обработки внутри модели.

model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
  # Data augmentation layers (only active during training)
  layer_random_flip('horizontal') |>
  layer_random_rotation(factor = 0.1) |>
  layer_random_zoom(height_factor = 0.1) |>
  # CNN backbone
  layer_conv_2d(32, c(3, 3), activation = 'relu', padding = 'same') |>
  layer_max_pooling_2d(c(2, 2)) |>
  layer_flatten() |>
  layer_dense(10, activation = 'softmax')

summary(model)

Оценка CNN

evaluate(model, x_test, y_test) возвращает значение функции потерь и точность на тестовых данных. Для более глубокого анализа используйте predict(), чтобы получить вероятности классов, а затем постройте матрицу ошибок или вычислите показатели F1 для каждого класса, чтобы понять, на каких примерах модель испытывает затруднения.

# Evaluate on test set
test_scores <- model |> evaluate(x_test, y_test, verbose = 0)
cat('Test accuracy:', test_scores['accuracy'])

# Get predicted classes
prob_matrix <- model |> predict(x_test)
pred_classes <- max.col(prob_matrix) - 1  # 0-indexed
true_classes <- mnist$test$y

# Confusion matrix
table(Predicted = pred_classes, True = true_classes)

Концепция переноса обучения

Для обучения CNN с нуля нужны большие наборы данных. Перенос обучения повторно использует слои извлечения признаков, предварительно обученные на ImageNet (например, VGG, ResNet, MobileNet), и обучает только специальную классификационную часть. В keras загрузите предварительно обученную основу с помощью application_mobilenet_v2() и заморозьте её слои.

# Load MobileNetV2 pretrained on ImageNet
base_model <- application_mobilenet_v2(
  weights      = 'imagenet',
  include_top  = FALSE,          # remove original classifier head
  input_shape  = c(224, 224, 3)
)

# Freeze pretrained weights
base_model$trainable <- FALSE

# Add custom classifier head
model <- keras_model(
  inputs  = base_model$input,
  outputs = base_model$output |>
    layer_global_average_pooling_2d() |>
    layer_dense(128, activation = 'relu') |>
    layer_dense(5, activation = 'softmax')
)

Дополнение и шаги Conv2D

Два важных аргумента layer_conv_2d: padding = 'same' добавляет вокруг входных данных нули, чтобы пространственный размер выхода совпадал с размером входа; padding = 'valid' (значение по умолчанию) уменьшает размеры на kernel_size - 1. strides = c(2,2) заменяет максимальное объединение, перемещая фильтр с шагом 2.

# 'same' padding: output = input size
conv_same <- layer_conv_2d(filters = 32, kernel_size = c(3, 3),
                           padding = 'same')

# Strided convolution instead of pooling
conv_strided <- layer_conv_2d(filters = 64, kernel_size = c(3, 3),
                              strides = c(2, 2),  # halves spatial dims
                              padding = 'same')

# Model using strides instead of max pooling
model2 <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
  layer_conv_2d(32, c(3,3), strides = c(2,2), activation = 'relu',
                padding = 'same') |>
  layer_conv_2d(64, c(3,3), strides = c(2,2), activation = 'relu',
                padding = 'same') |>
  layer_flatten() |>
  layer_dense(10, activation = 'softmax')
summary(model2)

Быстрая проверка

Каково основное назначение layer_max_pooling_2d(pool_size = c(2, 2)) в CNN?

Повторение: CNN

Главные выводы из темы «Основы свёрточных нейронных сетей»:

  • CNN используют локальные рецептивные поля и совместное использование параметров для эффективной обработки изображений.
  • layer_conv_2d(filters, kernel_size, activation) извлекает пространственные признаки.
  • layer_max_pooling_2d(pool_size) уменьшает размерность и обеспечивает инвариантность к переносу.
  • layer_flatten() связывает свёрточную основу с полносвязным классификатором.
  • layer_dropout(rate) регуляризует классификационную часть.
  • Слои расширения данных (layer_random_flip() и другие) уменьшают переобучение.
  • Перенос обучения с предварительно обученными основами — практичный подход для небольших наборов данных.
# Standard CNN architecture for image classification
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
  layer_conv_2d(32,  c(3,3), activation = 'relu', padding = 'same') |>
  layer_max_pooling_2d(c(2,2)) |>
  layer_conv_2d(64,  c(3,3), activation = 'relu', padding = 'same') |>
  layer_max_pooling_2d(c(2,2)) |>
  layer_conv_2d(128, c(3,3), activation = 'relu', padding = 'same') |>
  layer_flatten() |>
  layer_dense(256, activation = 'relu') |>
  layer_dropout(0.5) |>
  layer_dense(num_classes, activation = 'softmax')

model |> compile('adam', 'categorical_crossentropy', 'accuracy')
summary(model)

Часто задаваемые вопросы

Урок «Основы свёрточных нейронных сетей» бесплатный?

Да — полный текст урока «Основы свёрточных нейронных сетей» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы свёрточных нейронных сетей»?

Добавляйте слои Conv2D и MaxPooling для задач классификации изображений Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Основы свёрточных нейронных сетей»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка Keras и TensorFlow в R
  2. Создание последовательных моделей
  3. Основы свёрточных нейронных сетей
  4. Обучение, проверка и предотвращение переобучения
← Назад к R Academy