R Academy · 강의

합성곱 신경망 기초

이미지 분류 작업에 사용할 Conv2D와 MaxPooling 층을 추가합니다.

레슨 3/413개 단계

합성곱 신경망 기초은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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)은 입력에 kernel_size 크기의 학습 가능한 2차원 커널 filters개를 적용합니다. 각 필터는 한 종류의 공간 패턴을 감지하도록 학습됩니다. 출력의 형태는 (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은 여러 합성곱+풀링 블록을 쌓습니다. 초기 레이어는 낮은 수준의 특징(가장자리, 기울기)을 감지하고, 더 깊은 레이어는 이를 높은 수준의 특징(형태, 객체)으로 결합합니다. 공간 차원이 줄어드는 것을 보완하기 위해 각 합성곱 레이어는 필터 수를 늘립니다.

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()은 마지막 합성곱 블록의 3차원 출력 (height, width, filters)을 1차원 벡터로 변환합니다. 이는 특징 추출 백본(합성곱 레이어)과 분류 헤드(밀집 레이어)를 연결하는 다리 역할을 합니다.

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)

CNN에서의 layer_dropout()

CNN에서는 일반적으로 합성곱 블록 내부가 아니라 평탄화 레이어와 밀집 레이어 뒤에 드롭아웃을 적용합니다. 합성곱 블록 내부에서는 공간 드롭아웃인 layer_spatial_dropout_2d()를 사용하는 것이 좋습니다. 첫 번째 밀집 레이어 뒤에는 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도 밀집 네트워크와 같은 방식으로 컴파일하고 훈련합니다. 원-핫 레이블을 사용하는 다중 클래스 분류에는 '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'은 입력 주위에 0을 추가하여 출력의 공간 크기를 입력과 같게 만듭니다. 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)

빠른 확인

CNN에서 layer_max_pooling_2d(pool_size = c(2, 2))의 주된 목적은 무엇입니까?

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)
무료로 시작

AI 튜터와 함께 R을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
43
레슨
159

자주 묻는 질문

“합성곱 신경망 기초” 강의는 무료인가요?

네 — “합성곱 신경망 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“합성곱 신경망 기초”에서 뭘 배우나요?

이미지 분류 작업에 사용할 Conv2D와 MaxPooling 층을 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“합성곱 신경망 기초” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. R에서 Keras와 TensorFlow 설정하기
  2. 순차 모델 구축
  3. 합성곱 신경망 기초
  4. 학습, 검증 및 과적합 방지
← R Academy(으)로 돌아가기