主要内容

深層学習ネットワ,クの並列学習

この例では,ロ,カルマシンで複数の深層学習実験を実行する方法を説明します。この例をテンプレートとして使用し,特定のアプリケーションのニーズに合わせてネットワーク層と学習オプションを変更することができます。このアプロチは1または複数のgpuで使用可能です。图形处理器が1の場合,ネットワクの学習はバックグラウンドで順次行われます。この例のアプロ,チでは,深層学習実験の進行中にもmatlab®を続けて使用できます。

代わりに,実験マネジャを使用し,複数の深層ネットワ,クの学習を並列で対話的に行うこともできます。詳細にいては,実験マネ,ジャ,を使用したネットワ,クの並列学習を参照してください。

デ,タセットの準備

例を実行する前に,深層学習デ,タセットのロ,カルコピ,へのアクセスが必要です。この例では,0 ~ 9の数字の合成メジのデタセットを使用します。次のコ,ドで,使用しているデ,タセットを指すように場所を変更します。

datasetLocation = fullfile(matlabroot,“工具箱”“nnet”...“nndemos”“nndatasets”“DigitDataset”);

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

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

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

  • [ホ,ム]タブの[環境]セクションで[並列][既定のクラスタ,の選択]を選択して,クラウドクラスタ,を既定値として選択。

デ,タセットの読み込み

imageDatastoreオブジェクトを使用してデ,タセットを読み込みます。デ,タセットを学習セット,検証セット,テストセットに分割します。

imds = imageDatastore(datasetLocation,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.8,0.1);

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

imageSize = [28 28 1];pixelRange = [-4 4];imageAugmenter = imageDataAugmenter(...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augmentedImdsTrain = augmentedimagedastore (imageSize,imdsTrain,...“DataAugmentation”, imageAugmenter);

ネットワ,クの並列学習

Gpuと同じ数のワ,カ,を使用して並列プ,ルを起動します。関数gpuDeviceCount(并行计算工具箱)を使用することで,使用可能なgpuの数を確認できます。MATLABにより、各ワーカーに異なる GPU が割り当てられます。既定の設定では、parpoolは既定のクラスタプロファルを使用します。これは既定の設定を変更しない場合,当地的です。この例は,2のgpuを備えたマシンで実行されました。

numgpu = gpuDeviceCount(“可用”);parpool (numGPUs);
使用'Processes'配置文件启动并行池(parpool)…连接到并行池(工人数:2)。

学習中にワ,カ,から学習の進行状況の情報を送信するには,parallel.pool.DataQueue(并行计算工具箱)オブジェクトを使用します。デタキュを使用して学習中にフィドバックを取得する方法の詳細にいては,Parfevalを使用した複数の深層学習ネットワ,クの学習の例を参照してください。

dataqueue = parallel.pool.DataQueue;

ネットワ,ク層と学習オプションを定義します。コードの可読性のため,いくつかのネットワークアーキテクチャと学習オプションを返す関数でこれらを個別に定義することが可能です。この場合,networkLayersAndOptionsはネットワ,ク層の单元格配列と,それと同じ長さの学習オプションの配列を返します。Matlabでこの例を開き,networkLayersAndOptionsをクリックして補助関数networkLayersAndOptionsを開きます。独自のネットワ,ク層とオプションを貼り付けます。ファイルには,出力関数を使用して情報をデータキューに送信する方法を示すサンプルの学習オプションが含まれています。

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

学習の進行状況のプロットを用意し,各ワーカーがキューにデータを送信した後でこれらのプロットを更新するコールバック関数を設定します。preparePlotsupdatePlotsはこの例のための補助関数です。

handles = preparePlots(numel(layersCell));

afterEach (dataqueue @(数据)updatePlots(处理、数据));

計算結果を並列ワ,カ,内に保持するには,未来オブジェクトを使用します。各学習の結果のために未来オブジェクトの配列を事前に割り当てます。

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

ル,プを使用してネットワ,ク層とオプションをル,プし,parfeval(并行计算工具箱)を使用して並列ワ,カ,上でネットワ,クに学習させます。trainNetworkから出力引数を2要求するには,parfevalの2番目の入力引数として2を指定します。

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

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

未来オブジェクトから結果を取得するには,関数fetchOutputsを使用します。この例では,学習済みのネットワ,クとその学習情報を取得します。fetchOutputsは,結果が使用可能になるまでmatlabをブロックします。この手順には数分かかることがあります。

[network,trainingInfo] = fetchOutputs(trainingFuture);

関数保存を使用して結果をディスクに保存します。結果を後でもう一度読み込むには,関数负载を使用します。sprintfdatetimeを使用し,現在の日付と時刻を使用してファ。

文件名= sprintf(“实验——% s”datetime (“现在”“格式”的名称“T”HHmmss”));保存(文件名,“网络”“trainingInfo”);

結果のプロット

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

サブプロットを使用して,各ネットワ,クの異なるプロットを分布させます。この例の場合,サブプロットの1行目を使用して,エポック数に対する学習精度を検証精度と共にプロットします。

图(“单位”“归一化”“位置”,[0.1 0.1 0.6 0.6]);标题(“训练进度图”);i = 1:元素个数(layersCell)次要情节(2,元素个数(layersCell), i);持有;网格;ylim (100 [0]);iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);epoch = (1: number (trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingAccuracy);情节(时代,trainingInfo(我)。ValidationAccuracy,“同意”“MarkerSize”10);结束次要情节(元素个数(layersCell), 1), ylabel (“准确性”);

次に,サブプロットの2行目を使用して,エポック数に対する学習損失を検証損失と共にプロットします。

i=1:数字(layersCell) subplot(2,数字(layersCell),数字(layersCell) + i);持有;网格;ylim ([0 10]);iterationsPerEpoch = floor(augmentedImdsTrain.NumObservations/options(i).MiniBatchSize);epoch = (1: number (trainingInfo(i).TrainingAccuracy))/iterationsPerEpoch;情节(时代,trainingInfo(我).TrainingLoss);情节(时代,trainingInfo(我)。ValidationLoss,“同意”“MarkerSize”10);包含(“时代”);结束次要情节(元素个数(layersCell),元素个数(layersCell) + 1), ylabel (“损失”);

ネットワ,クを選択した後,分类を使用してテストデ,タimdsTestの精度を取得できます。

参考

|||(并行计算工具箱)|||

関連する例

詳細