Main Content

分類用の深層学習実験の作成

R2020a 以降

この例では、実験マネージャーを使用して分類用の深層学習ネットワークに学習させる方法を示します。この例では、2 つのネットワークに学習させて、MathWorks 商品のイメージを 5 つのクラスに分類します。各ネットワークには 3 つのアルゴリズムを使用して学習させます。それぞれの場合について、検証イメージ セットの真のクラスと、学習済みのネットワークによって予測されたクラスを混同行列で比較します。イメージ分類用のネットワークの学習の詳細については、Retrain Neural Network to Classify New Imagesを参照してください。

この実験には、Deep Learning Toolbox™ Model for GoogLeNet Network サポート パッケージが必要です。実験を実行する前に、googlenet関数を呼び出してダウンロード リンクをクリックし、このサポート パッケージをインストールします。

実験を開く

まず、例を開きます。実験マネージャーによって、事前構成済みの実験を含むプロジェクトが読み込まれます。これを検査したり実行したりできます。実験を開くには、[実験ブラウザー] ペインで [ClassificationExperiment] をダブルクリックします。

組み込みの学習実験は、説明、ハイパーパラメーターのテーブル、セットアップ関数、および実験の結果を評価するためのメトリクス関数の集合で構成されます。詳細については、trainnet を使用したネットワークの学習、およびカスタム メトリクスの表示を参照してください。

[説明] フィールドには、実験を説明するテキストが表示されます。この例の説明は次のようになります。

Merchandise image classification using:
* an untrained network (default) or a pretrained network (googlenet)
* various solvers for training networks (sgdm, rmsprop, or adam)

[ハイパーパラメーター] セクションでは、実験で使用する手法とハイパーパラメーター値を指定します。実験を実行すると、実験マネージャーは、ハイパーパラメーター テーブルで指定されたハイパーパラメーター値のすべての組み合わせを使用してネットワークに学習させます。この例では、以下の 2 つのハイパーパラメーターを使用します。

  • Network は、学習させるネットワークを指定します。このオプションには、"default" (イメージ分類用の実験テンプレートによって指定された既定のネットワーク) および "googlenet" (転移学習用に変更された層をもつ事前学習済みの GoogLeNet ネットワーク) が含まれています。

  • Solver は、ネットワークの学習に使用するアルゴリズムを示します。このオプションには、"sgdm" (モーメンタム項付き確率的勾配降下法)、"rmsprop" (平方根平均二乗伝播)、および "adam" (適応モーメント推定) が含まれています。これらのアルゴリズムの詳細については、アルゴリズムを参照してください。

[セットアップ関数] セクションでは、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成する関数を指定します。この関数を MATLAB® エディターで開くには、[編集] をクリックします。この関数のコードは、セットアップ関数にも示されています。セットアップ関数への入力は、ハイパーパラメーター テーブルのフィールドをもつ構造体です。関数は、イメージ分類問題用のネットワークに学習させるために使用する 3 つの出力を返します。この例のセットアップ関数には、以下のセクションが含まれています。

  • 「学習データの読み込み」では、学習データと検証データを含むイメージ データストアを定義します。この例では、MerchData.zip ファイルからイメージを読み込みます。この小さなデータ セットには、5 つの異なるクラスに属する MathWorks 商品のイメージが 75 枚含まれています。イメージのサイズは 227 x 227 x 3 です。このデータ セットの詳細については、イメージ データセットを参照してください。

filename = "MerchData.zip";
dataFolder = fullfile(tempdir,"MerchData");
if ~exist(dataFolder,"dir")
    unzip(filename,tempdir);
end
 
imdsTrain = imageDatastore(dataFolder, ...
    IncludeSubfolders=true, ....
    LabelSource="foldernames");
 
numTrainingFiles = 0.7;
[imdsTrain,imdsValidation] = splitEachLabel(imdsTrain,numTrainingFiles);

  • 「ネットワーク アーキテクチャの定義」では、深層学習分類用の畳み込みニューラル ネットワークのアーキテクチャを定義します。この例では、学習させるネットワークの選択は、ハイパーパラメーター Network の値によって決まります。

switch params.Network
    case "default"
        inputSize = [227 227 3];
        numClasses = 5;
        
        layers = [
            imageInputLayer(inputSize)
            convolution2dLayer(5,20)
            batchNormalizationLayer
            reluLayer
            fullyConnectedLayer(numClasses)
            softmaxLayer
            classificationLayer];
        
    case "googlenet"
        inputSize = [224 224 3];
        numClasses = 5;
        
        imdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
        imdsValidation = augmentedImageDatastore(inputSize(1:2), ...
            imdsValidation);
        
        net = googlenet;
        layers = layerGraph(net);
        
        newLearnableLayer = fullyConnectedLayer(numClasses, ...
            Name="new_fc", ...
            WeightLearnRateFactor=10, ...
            BiasLearnRateFactor=10);
        layers = replaceLayer(layers,"loss3-classifier",newLearnableLayer);
        
        newClassLayer = classificationLayer(Name="new_classoutput");
        layers = replaceLayer(layers,"output",newClassLayer);
       
    otherwise
        error("Undefined network selection.");
end

  • 「学習オプションの指定」では、実験用のtrainingOptionsオブジェクトを定義します。この例では、ハイパーパラメーター テーブルの Solver エントリで指定されたアルゴリズムを使用して、ネットワークに 8 エポック学習させます。

options = trainingOptions(params.Solver, ...
    MiniBatchSize=10, ...
    MaxEpochs=8, ...
    InitialLearnRate=1e-4, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    Verbose=false);

[メトリクス] セクションでは、実験の結果を評価するオプションの機能を指定します。この例にはカスタム メトリクス関数は含まれていません。

実験の実行

実験を実行すると、実験マネージャーはセットアップ関数で定義されたネットワークに 6 回学習させます。試行ごとに、ハイパーパラメーター値の異なる組み合わせが使用されます。既定では、実験マネージャーは一度に 1 つの試行を実行します。Parallel Computing Toolbox™ を使用している場合は、複数の試行を同時に実行したり、クラスター内のバッチ ジョブとして実験をオフロードしたりできます。

  • 実験を一度に 1 つずつ実行するには、[実験マネージャー] ツールストリップで [モード][Sequential] に設定し、[実行] をクリックします。

  • 複数の試行を同時に実行するには、[モード][Simultaneous] に設定し、[実行] をクリックします。現在の並列プールがない場合、実験マネージャーは既定のクラスター プロファイルを使用して並列プールを起動します。その後、実験マネージャーは並列プールにあるワーカーと同じ数の同時試行を実行します。最良の結果を得るには、実験を実行する前に、GPU と同じ数のワーカーで並列プールを起動します。詳細については、Run Experiments in ParallelおよびGPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

  • 実験をバッチ ジョブとしてオフロードするには、[モード][Batch Sequential] または [Batch Simultaneous] に設定し、クラスターとプールのサイズを指定して、[実行] をクリックします。詳細については、Offload Experiments as Batch Jobs to a Clusterを参照してください。

結果テーブルに、各試行の精度と損失が表示されます。

実験の実行中に学習プロットを表示して各試行の進行状況を追跡するには、[結果の確認][学習プロット] をクリックします。

結果の評価

実験で得られた最良の結果を見つけるには、結果テーブルを検証精度の順に並べ替えます。

  1. [検証精度] 列をポイントします。

  2. 三角形のアイコンをクリックします。

  3. [降順に並べ替え] を選択します。

検証精度の最も高い試行が、結果テーブルの 1 番上に表示されます。

この試行の混同行列を表示するには、結果テーブルで先頭の行を選択し、[結果の確認][検証データ] をクリックします。

実験結果に関する観測結果を記録するには、注釈を追加します。

  1. 結果テーブルで、最適な結果が得られた試行の [検証精度] セルを右クリックします。

  2. [注釈の追加] を選択します。

  3. [注釈] ペインで、テキスト ボックスに観測結果を入力します。

実験を閉じる

[実験ブラウザー] ペインで [MerchandiseClassificationProject] を右クリックし、[プロジェクトを閉じる] を選択します。実験マネージャーによって、プロジェクトに含まれる実験と結果が閉じられます。

セットアップ関数

この関数は、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成します。この関数への入力は、ハイパーパラメーター テーブルのフィールドをもつ構造体です。関数は、イメージ分類問題用のネットワークに学習させるために使用する 3 つの出力を返します。

function [imdsTrain,layers,options] = ClassificationExperiment_setup(params)

学習データの読み込み

filename = "MerchData.zip";
dataFolder = fullfile(tempdir,"MerchData");
if ~exist(dataFolder,"dir")
    unzip(filename,tempdir);
end
 
imdsTrain = imageDatastore(dataFolder, ...
    IncludeSubfolders=true, ....
    LabelSource="foldernames");
 
numTrainingFiles = 0.7;
[imdsTrain,imdsValidation] = splitEachLabel(imdsTrain,numTrainingFiles);

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

switch params.Network
    case "default"
        inputSize = [227 227 3];
        numClasses = 5;
        
        layers = [
            imageInputLayer(inputSize)
            convolution2dLayer(5,20)
            batchNormalizationLayer
            reluLayer
            fullyConnectedLayer(numClasses)
            softmaxLayer
            classificationLayer];
        
    case "googlenet"
        inputSize = [224 224 3];
        numClasses = 5;
        
        imdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
        imdsValidation = augmentedImageDatastore(inputSize(1:2), ...
            imdsValidation);
        
        net = googlenet;
        layers = layerGraph(net);
        
        newLearnableLayer = fullyConnectedLayer(numClasses, ...
            Name="new_fc", ...
            WeightLearnRateFactor=10, ...
            BiasLearnRateFactor=10);
        layers = replaceLayer(layers,"loss3-classifier",newLearnableLayer);
        
        newClassLayer = classificationLayer(Name="new_classoutput");
        layers = replaceLayer(layers,"output",newClassLayer);
       
    otherwise
        error("Undefined network selection.");
end

学習オプションの指定

options = trainingOptions(params.Solver, ...
    MiniBatchSize=10, ...
    MaxEpochs=8, ...
    InitialLearnRate=1e-4, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    Verbose=false);

end

参考

アプリ

関数

関連するトピック