0Pricing
R Academy · レッスン

畳み込みニューラルネットワークの基礎

画像分類タスク向けに Conv2D レイヤーと MaxPooling レイヤーを追加します。

「畳み込みニューラルネットワークの基礎」はCoddyKit上の無料R Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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の学習可能な2Dカーネルを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)は、各プーリングウィンドウ内の最大値を取得することで、空間次元を縮小します。これには2つの効果があります。後続の層のパラメータ数を減らすことと、ある程度の移動不変性を導入することです(小さなずれでは出力が大きく変化しません)。

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()は、最後の畳み込みブロックの3D出力(height, width, filters)を1Dベクトルに変換します。これは、特徴抽出を行うバックボーン(畳み込み層)と、分類ヘッド(全結合層)をつなぐ役割を果たします。

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では通常、ドロップアウトは畳み込みブロックの内部ではなく、flatten層と全結合層の後に適用します(畳み込みブロック内では、空間ドロップアウトlayer_spatial_dropout_2d()が推奨されます)。最初の全結合層の後に0.25~0.5のrateを設定するのが一般的です。

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の重要な引数は2つあります。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)

クイックチェック

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)

よくある質問

「畳み込みニューラルネットワークの基礎」レッスンは無料ですか?

はい。「畳み込みニューラルネットワークの基礎」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「畳み込みニューラルネットワークの基礎」で何を学びますか?

画像分類タスク向けに Conv2D レイヤーと MaxPooling レイヤーを追加します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「畳み込みニューラルネットワークの基礎」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. R で Keras と TensorFlow をセットアップする
  2. Sequential モデルの構築
  3. 畳み込みニューラルネットワークの基礎
  4. 学習、検証、過学習の防止
← R Academyに戻る