自動並列サポートを使用したクラウドでのネットワークの学習
この例では、並列学習用の 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");
クラスの数と各カテゴリのイメージの数を計算します。labelCount
は、ラベル、およびそれぞれのラベルが付いているイメージの数を格納する table です。学習データストアには、クラスごとに 5000 個のイメージ、合計 50000 個のイメージが含まれます。ニューラル ネットワークの最後の全結合層のクラス数を引数 OutputSize
として指定できます。
classes = categories(imdsTrain.Labels); numClasses = numel(classes); labelCount = countEachLabel(imdsTrain)
labelCount=10×2 table
Label Count
__________ _____
airplane 5000
automobile 5000
bird 5000
cat 5000
deer 5000
dog 5000
frog 5000
horse 5000
ship 5000
truck 5000
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(numClasses) softmaxLayer ];
複数の GPU を使用する場合、利用可能な計算リソースを増やします。GPU の数でミニバッチ サイズをスケールアップし、各 GPU での作業負荷を一定に維持します。また、ミニバッチ サイズに応じて学習率をスケーリングします。
miniBatchSize = 256 * numberOfGPUs; initialLearnRate = 1e-1 * miniBatchSize/256;
学習オプションを指定します。
SGDM ソルバーを使用して、ネットワークに 50 エポック学習させます。
実行環境を
parallel-auto
に設定して、現在のクラスターを使用してネットワークの並列学習を行います。プールから GPU にアクセスできる場合、GPU をもつワーカーが学習計算を実行します。そうでない場合、使用可能なすべての CPU ワーカーで学習が行われます。サポートされている GPU デバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。学習率のスケジュールを使用して、学習の進行に応じて学習率を下げます。
L2 正則化を使用して過適合を防止します。
ミニバッチ サイズを設定し、すべてのエポックでデータをシャッフルします。
検証データを使用してネットワークを検証します。
学習の進行状況プロットをオンにして、学習中に、可視化されたフィードバックを取得します。
ネットワークの精度を追跡します。
詳細出力を無効にします。
options = trainingOptions("sgdm", ... MaxEpochs=50, ... ExecutionEnvironment="parallel-auto", ... 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", ... Metrics="accuracy", ... Verbose=false);
ネットワークの学習と分類での使用
クラスターでネットワークに学習させます。学習中に進行状況のプロットが表示されます。
net = trainnet(augmentedImdsTrain,layers,"crossentropy",options);
学習済みネットワークを使用してローカル マシン上でテスト イメージを分類してから、予測ラベルを実際のラベルと比較します。複数の観測値を使用して予測を行うには、関数minibatchpredict
を使用します。予測スコアをラベルに変換するには、関数scores2label
を使用します。関数 minibatchpredict
は利用可能な GPU がある場合に自動的にそれを使用します。
scores = minibatchpredict(net,imdsTest); YTest = scores2label(scores,classes); accuracy = sum(YTest == imdsTest.Labels)/numel(imdsTest.Labels)
accuracy = 0.8938
再度使用しない場合は並列プールを閉じます。
delete(pool)
Parallel pool using the 'MyClusterInTheCloud' profile is shutting down.
サポート関数
畳み込みブロック関数
関数 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
参考
trainnet
| trainingOptions
| dlnetwork
| imageDatastore