Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

R2020a 以降

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

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

実験を開く

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

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

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

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 つの異なるクラスに属する 75 個の MathWorks 商品のイメージを含む小さなデータセットです。イメージのサイズは 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 と同じ数のワーカーで並列プールを起動します。詳細については、実験マネージャーを使用したネットワークの並列学習GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

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

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

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

結果の評価

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

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

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

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

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

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

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

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

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

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

詳細については、実験結果の並べ替え、フィルター処理、および注釈追加を参照してください。

実験を閉じる

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

セットアップ関数

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

参考

アプリ

関数

関連するトピック