ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

自動マルチ GPU サポートを使用したネットワークの学習

この例では、自動並列サポートにより、ローカル マシン上の複数の GPU を使用して深層学習を行う方法を説明します。深層学習ネットワークの学習には多くの場合、数時間または数日を要します。複数の GPU を使用して並列計算を行うことで、学習速度を向上できます。並列学習のオプションの詳細については、並列およびクラウドでの深層学習のスケールアップ (Deep Learning Toolbox)を参照してください。

要件

この例を実行するには、CIFAR-10 データセットをローカル マシンにダウンロードしなければなりません。次のコードは、現在のディレクトリにデータセットをダウンロードします。CIFAR-10 のローカル コピーが既にある場合は、この節を省略できます。

directory = pwd;
[locationCifar10Train,locationCifar10Test] = downloadCIFARToFolders(directory);
Downloading CIFAR-10 data set...done.
Copying CIFAR-10 to folders...done.

データセットの読み込み

imageDatastore オブジェクトを使用して、学習データセットおよびテスト データセットを読み込みます。次のコードで、データ ストアの場所が確実にローカル マシンの CIFAR-10 をポイントするようにします。

imdsTrain = imageDatastore(locationCifar10Train, ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

imdsTest = imageDatastore(locationCifar10Test, ...
 '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);

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

CIFAR-10 データセットのネットワーク アーキテクチャを定義します。コードを簡略化するために、入力を畳み込む畳み込みブロックを使用します。プーリング層は空間次元をダウンサンプリングします。

blockDepth = 4; % blockDepth controls the depth of a convolutional block.
netWidth = 32; % netWidth controls the number of filters in a convolutional block.

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
];

学習オプションを定義します。実行環境を ’multi-gpu' に設定し、複数の GPU を使用してネットワークに並列学習させます。複数の GPU を使用すると、使用できる計算リソースが増えます。各 GPU の作業負荷を一定に保つには、GPU の数に応じてミニバッチ サイズをスケール アップします。この例の GPU の数は 2 です。ミニバッチ サイズに従って学習率をスケーリングします。学習率スケジュールを使用して、学習の進行に伴って学習率を下げます。学習の進行状況プロットをオンにして、学習中に視覚的フィードバックを取得します。

numGPUs = 2;
miniBatchSize = 256*numGPUs;
initialLearnRate = 1e-1*miniBatchSize/256;

options = trainingOptions('sgdm', ...
    'ExecutionEnvironment','multi-gpu', ... % Turn on automatic multi-gpu support.
    'InitialLearnRate',initialLearnRate, ... % Set the initial learning rate.
    'MiniBatchSize',miniBatchSize, ... % Set the MiniBatchSize.
    'Verbose',false, ... % Do not send command line output.
    'Plots','training-progress', ... % Turn on the training progress plot.
    'L2Regularization',1e-10, ...
    'MaxEpochs',60, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsTest, ...
    'ValidationFrequency',floor(numel(imdsTrain.Files)/miniBatchSize), ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropFactor',0.1, ...
    'LearnRateDropPeriod',50);

ネットワークの学習および分類での使用

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

net = trainNetwork(augmentedImdsTrain,layers,options)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).

net = 
  SeriesNetwork with properties:

    Layers: [43×1 nnet.cnn.layer.Layer]

学習済みネットワークをローカル マシンで使用してテスト イメージを分類することで、ネットワークの精度を求めます。次に、予測されたラベルと実際のラベルを比較します。

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

自動マルチ GPU のサポートにより複数の GPU を活用することで、ネットワークの学習速度を向上できます。次のプロットは、NVIDIA© TITAN Xp GPU が 4 個搭載された Linux マシンで、GPU の数と共に全体的な学習速度が向上していることを示します。

補助関数の定義

ネットワーク アーキテクチャ内で畳み込みブロックを作成する関数を定義します。

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

参考

| |

関連するトピック