Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ チャレンジ:CNNの構築 | Convolutional Neural Networks
Pythonで学ぶコンピュータビジョンの基礎

チャレンジ:CNNの構築

メニューを表示するにはスワイプしてください

畳み込みニューラルネットワーク(CNN)は、階層的な特徴を抽出できるため、画像分類で広く利用されています。この課題では、CIFAR-10データセットを用いて、TensorFlowとKerasでVGG風CNNの実装と学習を行います。データセットは60,000枚の画像32×32×3)で構成されており、飛行機、自動車、鳥、猫などを含む10種類のクラスが含まれています。

このプロジェクトでは、データセットの読み込み、画像の前処理、CNNモデルの定義、学習、性能評価の手順を案内します。

CIFAR10

1. CNN向けデータ前処理

CNNを学習させる前に、データの前処理は性能向上や収束の高速化において重要なステップです。一般的な前処理方法には以下があります。

  • 正規化:画像の画素値を0から255の範囲から0から1の範囲にスケーリングします。通常はx_train / 255.0, x_test / 255.0のように実装されます。

  • ワンホットエンコーディング:ラベルは分類タスクのためにワンホットエンコードベクトルに変換されることが多いです。これは通常、keras.utils.to_categorical関数を使って、整数ラベル(例:0, 1, 2など)をワンホットエンコードベクトル(例:4クラス分類の場合は[1, 0, 0, 0])に変換します。

2. CNNアーキテクチャの構築

CNNアーキテクチャは、特徴抽出と予測を行う複数の層で構成。 主要なCNN層の実装方法:

畳み込み層(Conv2D)

keras.layers.Conv2D(filters, kernel_size, activation='relu', padding='same', input_shape=(height, width, channels))
Note
注意

input_shapeパラメータは、入力層でのみ指定。

プーリング層(MaxPooling2D)

keras.layers.MaxPooling2D(pool_size=(2, 2))

フラット化レイヤー

keras.layers.Flatten()

全結合レイヤー

layers.Dense(units=512, activation='relu')
layers.Dense(10, activation='softmax')
Note
注記

最終の全結合レイヤーは、通常、クラス数と同じユニット数を持ち、softmax活性化関数を使用してクラスごとの確率分布を出力。

3. モデルのコンパイル

アーキテクチャを定義した後、モデルをコンパイルする必要があります。このステップでは、損失関数、オプティマイザ、およびトレーニング中にモデルを導く指標を指定します。CNNで一般的に使用される方法は以下の通りです。

オプティマイザ(Adam)

オプティマイザは損失関数を最小化するためにモデルの重みを調整します。Adamオプティマイザは、その効率性とトレーニング中に学習率を適応的に調整できる点から広く利用されています。

keras.optimizers.Adam()

損失関数(Categorical Crossentropy)

多クラス分類の場合、損失関数として通常 categorical crossentropy が使用されます。これは次のように実装できます。

keras.losses.CategoricalCrossentropy()

指標

モデルの性能は分類タスク用の指標(精度、適合率、再現率など)で監視されます。これらは次のように定義できます。

metrics = [
    keras.metrics.Accuracy(), 
    keras.metrics.Precision(), 
    keras.metrics.Recall()
]

コンパイル

model.compile(optimizer='adam', 
              loss='categorical_crossentropy', # Or keras.losses.CategoricalCrossentropy()
              metrics=metrics)

4. モデルの学習

CNNの学習は、入力データをネットワークに与え、損失を計算し、バックプロパゲーションによって重みを更新するプロセス。 学習プロセスは、以下の主要なメソッドによって制御される。

  • モデルのフィッティング: fit() メソッドはモデルの学習に使用される。このメソッドは学習データ、エポック数、バッチサイズを受け取る。また、学習中に未知データでモデルの性能を評価するためのバリデーション分割もオプションで指定可能。
history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
  • バッチサイズとエポック数: バッチサイズはモデルの重みを更新する前に処理されるサンプル数を示し、エポック数はデータセット全体がモデルを通過する回数を示す。

5. 評価

分類レポート

sklearn.metrics.classification_report() はテストデータセットの正解値と予測値を比較します。各クラスごとの適合率(precision)、再現率(recall)、F1スコアが含まれます。ただし、メソッドはクラスラベルのみを受け取る必要があるため、ベクトルから元のクラスラベル([0,0,1,0] -> 2)に戻すことを忘れないでください。

y_pred = model.predict(x_test)
y_pred_classes = np.argmax(y_pred,axis = 1)
y_test_classes = np.argmax(y_test, axis = 1)

report = classification_report(y_test_classes, y_pred_classes, target_names=class_names)
print(report)

評価

モデルの学習が完了したら、テストデータセットで評価を行い、汎化性能を確認します。評価では、.compile() メソッドで指定した指標が提供されます。評価は .evaluate() を使用して実行します。

results = model.evaluate(x_test, y_test, verbose=2, return_dict=True)

混同行列

モデルの性能をさらに詳しく分析するために、混同行列を可視化できます。混同行列は、各クラスごとの真陽性、偽陽性、真陰性、偽陰性の予測を示します。混同行列は TensorFlow を使って計算できます。

confusion_mtx = tf.math.confusion_matrix(y_test_classes, y_pred_classes)

この行列はヒートマップを用いて可視化でき、各クラスごとのモデルの性能を観察可能:

plt.figure(figsize=(12, 9))
c = sns.heatmap(confusion_mtx, annot=True, fmt='g')
c.set(xticklabels=class_names, yticklabels=class_names)

plt.show()

課題

1. データセットの読み込みと前処理

  • KerasからCIFAR-10データセットをインポート;
  • ピクセル値を [0,1] の範囲に正規化し、収束性を向上;
  • クラスラベルを one-hot encoded 形式に変換し、多クラス分類に対応。

2. CNNモデルの定義

以下の主要な層を持つVGG風CNNアーキテクチャの実装: VGG like architecture

畳み込み層:

  • カーネルサイズ:3×3
  • 活性化関数:ReLU
  • パディング:'same'

プーリング層:

  • プーリングタイプ:max pooling
  • プーリングサイズ:2×2

ドロップアウト層(ニューロンをランダムに無効化し過学習を防止):

  • ドロップアウト率:25%

フラット化層 - 2次元特徴マップを分類用の1次元ベクトルに変換。

全結合層 - 最終分類用の密結合層、出力層はreluまたはsoftmax。

モデルのコンパイル:

  • Adam optimizer(効率的な学習のため);
  • Categorical cross-entropy損失関数(多クラス分類用);
  • Accuracy metricメトリクスで性能評価(クラスは均等、他の指標も追加可能)。

3. モデルの学習

  • 学習用パラメータepochsbatch_sizeを指定(例:epochs=20, batch_size=64);
  • validation_splitパラメータで訓練データの何%を検証用にするかを指定し、未知画像での性能を追跡;
  • 学習履歴を保存し、精度と損失の推移を可視化。

4. 評価と結果の可視化

  • CIFAR-10テストデータでモデルを評価し、精度を出力;
  • 学習損失と検証損失をプロットし、過学習を確認;
  • 学習精度と検証精度をプロットし、学習の進行を確認。

COLAB CNN PROJECT

question-icon

キーの各部分を入力してください(プロジェクト完了後に受け取ったもの)

1.  2.  3.  4.  5.
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  7

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  7
some-alt