Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

自動並列サポートを使用したクラウドでのネットワークの学習

この例では、並列学習用の MATLAB の自動サポートを使用して畳み込みニューラル ネットワークに学習させる方法を説明します。多くの場合、深層学習における学習には数時間または数日かかります。並列計算を使用すると、複数のグラフィックス処理装置 (GPU) をローカルで、またはクラウドのクラスターで使用して、学習を高速化できます。複数の GPU があるマシンにアクセスできる場合は、データのローカル コピーに対してこの例を完了させることができます。より多くのリソースを使用する必要がある場合は、深層学習における学習をクラウドにスケールアップできます。並列学習のオプションの詳細は、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。この例では、MATLAB の自動並列サポートを使用して、クラウドのクラスターで深層学習ネットワークに学習させる手順について順を追って説明します。

要件

例を実行する前に、クラスターを構成し、データをクラウドにアップロードする必要があります。MATLAB では、MATLAB デスクトップから直接、クラウドにクラスターを作成できます。[ホーム] タブの [環境] エリアで、[並列][クラスターの作成と管理] を選択します。クラスター プロファイル マネージャーで、[クラウド クラスターの作成] をクリックします。または、MathWorks Cloud Center を使用して計算クラスターを作成し、そのクラスターにアクセスすることもできます。詳細については、Getting Started with Cloud Center を参照してください。その後、データを Amazon S3 バケットにアップロードして、MATLAB から直接アクセスします。この例では、Amazon S3 に既に格納されている CIFAR-10 データセットのコピーを使用します。手順については、AWS での深層学習データの処理を参照してください。

クラスターの設定

クラウド クラスターを選択して並列プールを起動し、ワーカー数をクラスターの GPU 数に設定します。GPU より多くのワーカーを指定した場合、残りのワーカーはアイドル状態になります。

numberOfGPUs = 4;
cluster = parcluster("MyClusterInTheCloud");
pool = parpool(cluster,numberOfGPUs);
Starting parallel pool (parpool) using the 'MyClusterInTheCloud' profile ...
Connected to parallel pool with 4 workers.

クラスターを指定しない場合、既定のクラスター プロファイルが使用されます。MATLAB の [ホーム] タブの [環境] エリアで [並列][クラスターの作成と管理] を選択し、既定のクラスター プロファイルを確認します。

クラウドからのデータセットの読み込み

imageDatastore を使用して、学習データセットとテスト データセットをクラウドから読み込みます。この例では、Amazon S3 に格納されている CIFAR-10 データセットのコピーを使用します。ワーカーがクラウドのデータストアに確実にアクセスできるように、AWS 資格情報の環境変数が正しく設定されていることを確認してください。AWS での深層学習データの処理を参照してください。

imdsTrain = imageDatastore("s3://cifar10cloud/cifar10/train", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

imdsTest = imageDatastore("s3://cifar10cloud/cifar10/test", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

augmentedImageDatastore オブジェクトを作成し、拡張イメージ データを使用してネットワークに学習させます。ランダムな平行移動と水平方向の反転を使用します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

imageSize = [32 32 3];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    RandXReflection=true, ...
    RandXTranslation=pixelRange, ...
    RandYTranslation=pixelRange);
augmentedImdsTrain = augmentedImageDatastore(imageSize,imdsTrain, ...
    DataAugmentation=imageAugmenter, ...
    OutputSizeMode="randcrop");

ネットワーク アーキテクチャと学習オプションの定義

CIFAR-10 データセット用のネットワーク アーキテクチャを定義します。コードを簡略化するために、入力を畳み込む畳み込みブロックを使用します。層の反復ブロック (それぞれに畳み込み層、バッチ正規化層、ReLU 層を含む) を作成するサポート関数 convolutionalBlock は、この例の最後に示されています。プーリング層は空間次元をダウンサンプリングします。

blockDepth = 4;
netWidth = 32;

layers = [
    imageInputLayer(imageSize) 
    
    convolutionalBlock(netWidth,blockDepth)
    maxPooling2dLayer(2,Stride=2)
    convolutionalBlock(2*netWidth,blockDepth)
    maxPooling2dLayer(2,Stride=2)    
    convolutionalBlock(4*netWidth,blockDepth)
    averagePooling2dLayer(8) 
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer
];

複数の GPU を使用する場合、利用可能な計算リソースを増やします。GPU の数でミニバッチ サイズをスケールアップし、各 GPU での作業負荷を一定に維持します。また、ミニバッチ サイズに応じて学習率をスケーリングします。

miniBatchSize = 256 * numberOfGPUs;
initialLearnRate = 1e-1 * miniBatchSize/256;

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

  • SGDM ソルバーを使用して、ネットワークに 50 エポック学習させます。

  • 実行環境を parallel に設定して、現在のクラスターを使用してネットワークの並列学習を行います。

  • 学習率のスケジュールを使用して、学習の進行に応じて学習率を下げます。

  • L2 正則化を使用して過適合を防止します。

  • ミニバッチ サイズを設定し、すべてのエポックでデータをシャッフルします。

  • 検証データを使用してネットワークを検証します。

  • 学習の進行状況プロットをオンにして、学習中に、可視化されたフィードバックを取得します。

  • 詳細出力を無効にします。

options = trainingOptions("sgdm", ...
    MaxEpochs=50, ...
    ExecutionEnvironment="parallel", ...
    InitialLearnRate=initialLearnRate, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropFactor=0.1, ...
    LearnRateDropPeriod=45, ...
    L2Regularization=1e-10, ...
    MiniBatchSize=miniBatchSize, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsTest, ...
    ValidationFrequency=floor(numel(imdsTrain.Files)/miniBatchSize), ...
    Plots="training-progress", ...
    Verbose=false);

ネットワークの学習と分類での使用

クラスターでネットワークに学習させます。学習中に進行状況のプロットが表示されます。

net = trainNetwork(augmentedImdsTrain,layers,options);

学習済みネットワークを使用してローカル マシン上でテスト イメージを分類してから、予測ラベルを実際のラベルと比較します。

YPredicted = classify(net,imdsTest);
accuracy = sum(YPredicted == imdsTest.Labels)/numel(imdsTest.Labels)
accuracy = 0.8968

再度使用しない場合は並列プールを閉じます。

delete(pool)

サポート関数

畳み込みブロック関数

関数 convolutionalBlock は、numConvBlocks 個の畳み込みブロック (それぞれに 2 次元畳み込み層、バッチ正規化層、ReLU 層を含む) を作成します。各 2 次元畳み込み層は、numFilters 個の 3 行 3 列フィルターをもちます。

function layers = convolutionalBlock(numFilters,numConvBlocks)
    layers = [
        convolution2dLayer(3,numFilters,Padding="same")
        batchNormalizationLayer
        reluLayer
    ];
    
    layers = repmat(layers,numConvBlocks,1);
end

参考

| |

関連するトピック