Основы свёрточных нейронных сетей
Добавляйте слои 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 — локальная установка не требуется.
Все уроки этого курса
- Настройка Keras и TensorFlow в R
- Создание последовательных моделей
- Основы свёрточных нейронных сетей
- Обучение, проверка и предотвращение переобучения