Main Content

シンプルなイメージ分類ネットワークの作成

この例では、深層学習による分類用のシンプルな畳み込みニューラル ネットワークを作成し、学習を行う方法を説明します。畳み込みニューラル ネットワークは深層学習に不可欠なツールであり、特にイメージの認識に適しています。

この例では、以下を実行する方法を示します。

  • イメージ データを読み込みます。

  • ネットワーク アーキテクチャを定義します。

  • 学習オプションを指定します。

  • ネットワークに学習をさせます。

  • 新しいデータのラベルを予測し、分類精度を計算します。

シンプルなイメージ分類ネットワークの作成および学習を対話的に行う方法を示す例については、イメージ分類入門を参照してください。

データの読み込み

数字のサンプル データを解凍し、イメージ データストアを作成します。関数 imageDatastore は、フォルダー名に基づいてイメージに自動的にラベルを付けます。

unzip("DigitsData.zip")
imds = imageDatastore("DigitsData", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

データを学習データセットと検証データセットに分割し、学習セットの各カテゴリに 750 個のイメージが含まれ、検証セットに各ラベルの残りのイメージが含まれるようにします。splitEachLabel は、イメージ データストアを学習用と検証用の 2 つの新しいデータストアに分割します。

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,"randomized");

クラス名を表示します。

classNames = categories(imdsTrain.Labels)
classNames = 10x1 cell
    {'0'}
    {'1'}
    {'2'}
    {'3'}
    {'4'}
    {'5'}
    {'6'}
    {'7'}
    {'8'}
    {'9'}

ネットワーク アーキテクチャの定義

畳み込みニューラル ネットワーク アーキテクチャを定義します。ネットワークの入力層にイメージのサイズを指定し、全結合層にクラスの数を指定します。それぞれのイメージは 28 x 28 x 1 ピクセルで、10 個のクラスがあります。

inputSize = [28 28 1];
numClasses = 10;

layers = [
    imageInputLayer(inputSize)
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer];

深層学習層の詳細は、深層学習層の一覧を参照してください。

学習オプションの指定

学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、Experiment Managerアプリを使用できます。

options = trainingOptions("sgdm", ...
    MaxEpochs=4, ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=30, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

ニューラル ネットワークの学習

関数trainnetを使用してニューラル ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。既定では、関数 trainnet は利用可能な GPU がある場合にそれを使用します。GPU を使用するには、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数は CPU を使用します。実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。

net = trainnet(imdsTrain,layers,"crossentropy",options);

ニューラル ネットワークのテスト

ニューラル ネットワークをテストするには、検証データを分類し、分類精度を計算します。

関数minibatchpredictを使用して予測を行い、関数scores2labelを使用してスコアをラベルに変換します。既定では、関数 minibatchpredict は利用可能な GPU がある場合にそれを使用します。

scores = minibatchpredict(net,imdsValidation);
YValidation = scores2label(scores,classNames);

分類精度を計算します。精度は、正しく予測されたラベルの割合です。

TValidation = imdsValidation.Labels;
accuracy = mean(YValidation == TValidation)
accuracy = 0.9896

深層学習の次のステップとして、事前学習済みのネットワークを他のタスクに使用してみることができます。転移学習または特徴抽出を使用して、自分のイメージ データで新しい分類問題を解決してみましょう。例については、転移学習を使用した短時間での深層学習の開始事前学習済みのネットワークから抽出された特徴を使用した分類器の学習を参照してください。事前学習済みのネットワークの詳細は、事前学習済みの深層ニューラル ネットワークを参照してください。

参考

| |

関連するトピック