Main Content

イメージ分類入門

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

イメージ データの読み込み

数字のサンプル データをイメージ データストアとして読み込みます。このデータにアクセスするには、例をライブ スクリプトとして開きます。関数 imageDatastore は、フォルダー名に基づいてイメージに自動的にラベルを付けます。データ セットには 10 個のクラスがあり、データ セット内の各イメージは 28 x 28 x 1 ピクセルです。

unzip("DigitsData.zip")

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

classNames = categories(imds.Labels);

データを学習データ セット、検証データ セット、テスト データ セットに分割します。イメージの 70% は学習に使用し、15% は検証に使用し、15% はテストに使用します。"randomized" を指定し、各クラスの指定された割合のファイルを新しいデータ セットに割り当てます。関数 splitEachLabel は、イメージ データストアを 3 つの新しいデータストアに分割します。

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,"randomized");

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

ネットワークを構築するには、ディープ ネットワーク デザイナー アプリを使用します。

deepNetworkDesigner

空のネットワークを作成するには、[空のネットワーク][新規] をクリックします。

[デザイナー] ペインで、畳み込みニューラル ネットワーク アーキテクチャを定義します。[層のライブラリ] から層をドラッグして結合します。層をすばやく検索するには、[層のライブラリ] ペインの [層のフィルター] 検索ボックスを使用します。層のプロパティを編集するには、層をクリックして、[プロパティ] ペインで値を編集します。

これらの層を順番にドラッグして、順に結合します。まず、[imageInputLayer] をキャンバスにドラッグし、[InputSize]28,28,1 に設定します。

次に、以下の層をキャンバスにドラッグし、順番に結合します。

  • convolution2dLayer

  • batchNormalizationLayer

  • reluLayer

次に、[fullyConnectedLayer] を結合し、[OutputSize] をデータのクラス数 (この例では 10) に設定します。

最後に [softmaxLayer] を追加します。

ネットワークの学習の準備が整っていることを確認するには、[解析] をクリックします。深層学習ネットワーク アナライザーによってエラーや警告が報告されていないため、ネットワークの学習の準備は整っています。ネットワークをエクスポートするには、[エクスポート] をクリックします。アプリはネットワークを変数 net_1 として保存します。

学習オプションの指定

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

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

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

関数trainnetを使用してニューラル ネットワークに学習させます。分類が目的なので、クロスエントロピー損失を使用します。

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

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

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

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

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

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

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

予測の一部を可視化します。

numValidationObservations = numel(imdsValidation.Files);
idx = randi(numValidationObservations,9,1);

figure
tiledlayout("flow")
for i = 1:9
    nexttile
    img = readimage(imdsValidation,idx(i));
    imshow(img)
    title("Predicted Class: " + string(YValidation(idx(i))))
end

深層学習の次のステップとして、事前学習済みのネットワークを使用して転移学習を試すことができます。例については、転移学習入門を参照してください。

参考

|

関連するトピック