ドキュメンテーション

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

複数の深層学習実験の実行

この例では、ローカル マシン上で複数の深層学習実験を実行する方法を説明します。この例をテンプレートとして使用し、特定のアプリケーションのニーズに合わせてネットワーク層および学習オプションを変更できます。この方法は単一または複数の GPU で使用できます。単一の GPU の場合、ネットワークの学習はバックグラウンドで 1 つずつ行われます。この例の方法では、深層学習実験の処理中に MATLAB® を使用し続けることができます。

データセットの準備

例を実行するには、深層学習データセットのローカル コピーにアクセスできなければなりません。この例では、0 ~ 9 の数字からなる合成イメージをもつデータセットを使用します。次のコードで、使用するデータセットを指すように場所を変更します。

datasetLocation = fullfile(matlabroot,'toolbox','nnet', ...
    'nndemos','nndatasets','DigitDataset');

さらに多くのリソースを使用して実験を実行する場合は、この例をクラウド内のクラスターで実行できます。

  • データセットを Amazon S3 バケットにアップロードします。例については、クラウドへの深層学習データのアップロードを参照してください。

  • クラウド クラスターを作成します。MATLAB では、MATLAB デスクトップから直接クラウドにクラスターを作成できます。詳細については、クラウド クラスターの作成を参照してください。

  • [ホーム] タブの [環境] セクションで [並列][既定のクラスターの選択] を選択し、使用するクラウド クラスターを既定として選択します。

データセットの読み込み

imageDatastore オブジェクトを使用してデータセットを読み込みます。データセットを学習、検証およびテストの各セットに分割します。

imds = imageDatastore(datasetLocation, ...
 'IncludeSubfolders',true, ...
 'LabelSource','foldernames');

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.8,0.1);

拡張イメージ データを使用してネットワークに学習させるために、augmentedImageDatastoreを作成します。ランダムな平行移動と水平方向の反射パターンを使用します。データ拡張は、ネットワークによる過適合と、学習イメージそのものの細部の記憶を防ぐ上で役立ちます。

imageSize = [28 28 1];
pixelRange = [-4 4];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augmentedImdsTrain = augmentedImageDatastore(imageSize,imdsTrain, ...
    'DataAugmentation',imageAugmenter);

ネットワークの並列学習

GPU と同数のワーカーをもつ並列プールを開始します。関数gpuDeviceCountを使用して、使用できる GPU の数を確認できます。MATLAB は各ワーカーに異なる GPU を割り当てます。既定で、parpool は既定のクラスター プロファイルを使用します。既定を変更していない場合は local です。この例は、2 つの GPU をもつ 1 台のマシンを使用して実行されました。

numGPUs = 2;
parpool(numGPUs);
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 2).

学習中に、学習の進行状況の情報をワーカーから送信するには、DataQueueオブジェクトを使用します。学習中にデータ キューを使用してフィードバックを取得する方法の詳細については、parfeval を使用した複数の深層学習ネットワークの学習の例を参照してください。

dataqueue = parallel.pool.DataQueue;

ネットワーク層および学習オプションを定義します。コードの可読性のために、それらを複数のネットワーク アーキテクチャと学習オプションを返す個別の関数で定義できます。この例の networkLayersAndOptions は、同じ長さのネットワーク層の cell 配列と学習オプションの配列を返します。MATLAB でこの例を開いてから、networkLayersAndOptions をクリックしてサポート関数 networkLayersAndOptions を開きます。使用するネットワーク層およびオプションを貼り付けます。このファイルには、出力関数を使用してデータ キューに情報を送信する方法を示すサンプルの学習オプションが含まれます。

[layersCell,options] = networkLayersAndOptions(augmentedImdsTrain,imdsValidation,dataqueue);

学習の進行状況プロットを準備し、各ワーカーがデータをキューに送信すると、これらのプロットを更新するようにコールバック関数を設定します。preparePlots および updatePlots はこの例のサポート関数です。

handles = preparePlots(numel(layersCell));

afterEach(dataqueue,@(data) updatePlots(handles,data));

並列ワーカーの計算結果を保持するために、Future オブジェクトを使用します。個々の学習結果用に、Future オブジェクトの配列を事前に割り当てます。

trainingFuture(1:numel(layersCell)) = parallel.FevalFuture;

for ループを使用してネットワーク層およびオプションをループし、parfevalを使用して並列ワーカー上のネットワークに学習させます。trainNetwork に 2 つの出力引数を要求するには、parfeval の 2 番目の入力引数として 2 を指定します。

for i=1:numel(layersCell)
    trainingFuture(i) = parfeval(@trainNetwork,2,augmentedImdsTrain,layersCell{i},options(i));
end

parfeval は MATLAB をブロックしないため、計算の実行中に作業を続行できます。

Future オブジェクトから結果を取得するために、関数 fetchOutputs を使用します。この例では、学習済みネットワークおよびその学習情報を取得します。fetchOutputs は結果が使用可能になるまで MATLAB をブロックします。この手順には数分かかることがあります。

[network,trainingInfo] = fetchOutputs(trainingFuture);

関数 save を使用して結果をディスクに保存します。後で結果を再度読み込むには、関数loadを使用します。

save(['experiment-' datestr(now,'yyyymmddTHHMMSS')],'network','trainingInfo');

結果のプロット

ネットワークの学習が完了した後、trainingInfo の情報を使用して学習の進行状況をプロットします。

サブプロットを使用して、各ネットワークについて異なるプロットを分布させます。この例では、サブプロットの最初の行を使用して、エポック数に対する学習精度および検証精度をプロットします。

figure('Units','normalized','Position',[0.1 0.1 0.6 0.6]);
title('Training Progress Plots');

for i=1:numel(layersCell)
    subplot(2,numel(layersCell),i);
    hold on; grid on;
    ylim([0 100]);
    iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);
    epoch = (1:numel(trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;
    plot(epoch,trainingInfo(i).TrainingAccuracy);
    plot(epoch,trainingInfo(i).ValidationAccuracy,'.k','MarkerSize',10);
end
subplot(2,numel(layersCell),1), ylabel('Accuracy');

次に、サブプロットの 2 番目の行を使用し、エポック数に対する学習損失および検証損失をプロットします。

for i=1:numel(layersCell)
    subplot(2,numel(layersCell),numel(layersCell) + i);
    hold on; grid on;
    ylim([0 max([trainingInfo.TrainingLoss])]);
    iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);
    epoch = (1:numel(trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;
    plot(epoch,trainingInfo(i).TrainingLoss);
    plot(epoch,trainingInfo(i).ValidationLoss,'.k','MarkerSize',10);
    xlabel('Epoch');
end
subplot(2,numel(layersCell),numel(layersCell)+1), ylabel('Loss');

ネットワークの選択後、classifyを使用してテスト データ imdsTest に関するネットワークの精度を取得できます。

参考

| | | | |

関連する例

詳細