畳み込みニューラルネットワークの基礎
画像分類タスク向けに 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- R で Keras と TensorFlow をセットアップする
- Sequential モデルの構築
- 畳み込みニューラルネットワークの基礎
- 学習、検証、過学習の防止