主要内容

Parforを使用した複数の深層学習ネットワ,クの学習

この例では,parforルプを使用して,学習オプションにいてのパラメタスプを実行する方法を説明します。

多くの場合,深層学習における学習には数時間または数日かかるため,適切な学習オプションを見つけるのが難しい場合があります。並列計算を使用すると,適切なモデルの探索を高速化および自動化できます。複数のグラフィックス処理装置(GPU)があるマシンにアクセスできる場合は,ローカルのparpoolを使用してデータセットのローカルコピーに対してこの例を完了させることができます。より多くのリソースを使用する必要がある場合は,深層学習における学習をクラウドにスケールアップできます。この例では,parforル,プを使用して,クラウドのクラスタ,における学習オプションMiniBatchSizeにいてのパラメタスプを実行する方法を説明します。スクリプトを変更して,他の学習オプションにいてのパラメタスプを実行できます。また,この例では,DataQueueを使用して計算中にワ,カ,からフィ,ドバックを取得する方法も説明します。スクリプトをバッチジョブとしてクラスターに送信することもできるため,作業を続行したり,MATLABを閉じて後で結果を取得したりできます。詳細にいては,深層学習バッチジョブのクラスタ,への送信を参照してください。

要件

この例を実行する前に,クラスタ,を構成し,デ,タをクラウドにアップロ,ドする必要があります。Matlabでは,Matlabデスクトップから直接,クラウドにクラスタ,を作成できます。[ホ,ム]タブの[並列]メニュ,で,[クラスタ,の作成と管理]を選択します。クラスタプロファルマネジャで,[クラウドクラスタ,の作成]をクリックします。またはMathWorks云中心を使用して計算クラスターを作成し,そのクラスターにアクセスすることもできます。詳細にいては,开始使用云中心を参照してください。この例では,MATLABの[ホ,ム]タブの[並列][既定のクラスタ,の選択]で,クラスタ,が既定として設定されていることを確認します。その後,データをAmazon S3バケットにアップロードして,MATLABから直接使用します。この例では,Amazon S3 に既に格納されている CIFAR-10 データセットのコピーを使用します。手順については、クラウドへの深層学習デ,タのアップロ,ドを参照してください。

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

imageDatastoreを使用して,学習デ,タセットとテストデ,タセットをクラウドから読み込みます。学習データセットは学習セットと検証セットに分割し,テストデータセットはパラメータースイープから得られる最適なネットワークをテストするために保持します。この例では,Amazon S3に格納されているCIFAR-10データセットのコピーを使用します。ワーカーがクラウドのデータストアに確実にアクセスできるように,AWS資格情報の環境変数が正しく設定されていることを確認してください。クラウドへの深層学習デ,タのアップロ,ドを参照してください。

imds = imageDatastore(s3: / / cifar10cloud / cifar10 /火车'...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);imdsTest = imageDatastore(s3: / / cifar10cloud / cifar10 /测试”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9);

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

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

ネットワ,クア,キテクチャの定義

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

imageSize = [32 32 3];netDepth = 2;% netDepth控制卷积块的深度netWidth = 16;% netWidth控制卷积块中的过滤器数量图层= [imageInputLayer(imageSize) convolutionalBlock(netWidth,netDepth) maxPooling2dLayer(2,“步”,2) convolutionalBlock(2* nettwidth,netDepth) maxPooling2dLayer(2,“步”,2) convolutionalBlock(4*netWidth,netDepth) averagePooling2dLayer(8) fullyConnectedLayer(10) softmaxLayer classificationLayer];

複数のネットワ,クの同時学習

パラメタスプを実行するミニバッチサズを指定します。結果として得られるネットワ,クおよび精度のための変数を割り当てます。

miniBatchSizes = [64 128 256 512];numMiniBatchSizes = nummel (miniBatchSizes);trainedNetworks = cell(numMiniBatchSizes,1);精度= 0 (numMiniBatchSizes,1);

parforループ内で複数のネットワークに学習させ,ミニバッチサイズを変化させる並列パラメータースイープを実行します。クラスター内のワーカーは複数のネットワークに同時に学習させ,学習が完了すると,学習済みネットワークと精度を送り返します。学習が適切に行われていることを確認する場合は,学習オプションで详细的真正的に設定します。ワーカーは個別に計算を行うため,コマンドライン出力は反復と同じ順序にはならないことに注意してください。

parforidx = 1:numMiniBatchSizes miniBatchSize = miniBatchSizes(idx);initialLearnRate = 1e-1 * miniBatchSize/256;根据迷你批处理大小缩放学习率。定义培训选项。设置迷你批大小。选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...在扫描中设置相应的MiniBatchSize。“详细”假的,...不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置缩放学习率。“L2Regularization”1平台以及...“MaxEpochs”30岁的...“洗牌”“every-epoch”...“ValidationData”imdsValidation,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”25);在集群中的一个worker中训练网络。net = trainNetwork(augmentedImdsTrain,layers,options);%为了获得这个网络的准确性,使用训练过的网络对工人上的验证图像进行分类,并将预测的标签与标签进行比较%实际标签。ypredict =分类(net,imdsValidation);accuracies(idx) = sum(ypredict == imdsValidation.Labels)/numel(imdsValidation.Labels);将训练好的网络发送回客户端。trainedNetworks{idx} = net;结束
使用' myclusterincloud '配置文件启动并行池(parpool)…连接到并行池(工人数量:4)。

parforが終了すると,trainedNetworksにはワ,カ,による学習の結果として得られたネットワ,クが含まれます。学習済みネットワ,クとその精度を表示します。

trainedNetworks
trainedNetworks =4×1单元格数组{1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork}
精度
精度=4×10.8188 0.8232 0.8162 0.8050

精度に基づいて最適なネットワ,クを選択します。テストデ,タセットに対してそのパフォ,マンスをテストします。

[~, I] = max(精度);bestNetwork = trainedNetworks{I(1)};ypredict = category (bestNetwork,imdsTest);accuracy = sum(ypredict == imdsTest.Labels)/numel(imdsTest.Labels)
准确度= 0.8173

学習時のフィ,ドバックデ,タの送信

各ワ,カ,の学習の進行状況を示すプロットを準備して初期化します。animatedLineを使用すると,変化するデ,タを簡単に表示できます。

F =数字;f.可见=真实;I =1:4 subplot(2,2, I)“迭代”);ylabel (“训练的准确性”);Lines (i) = animatedline;结束

DataQueueを使用して学習の進行状況デタをワカからクラアントに送信してから,デタをプロットします。afterEachを使用して,ワ,カ,から学習の進行状況フィ,ドバックが送信されるたびにプロットを更新します。パラメタ选择には,ワ,カ,学習の反復,および学習精度に関する情報が含まれます。

D = parallel.pool.DataQueue;afterEach(D, @(opts) updatePlot(lines, opts{:}));

異なるミニバッチサイズによるparforループ内で複数のネットワークに学習させる並列パラメータースイープを実行します。反復ごとに学習の進行状況をクラesc escアントに送信するために,学習オプションでOutputFcnを使用することに注意してください。この図は4つの異なるワーカーについて,下記のコードの実行時における学習の進行状況を示しています。

parforidx = 1: nummel (miniBatchSizes) miniBatchSize = miniBatchSizes(idx);initialLearnRate = 1e-1 * miniBatchSize/256;根据miniBatchSize缩放学习率。定义培训选项。设置输出函数将数据发回%传递给客户端。选项= trainingOptions(“个”...“MiniBatchSize”miniBatchSize,...在扫描中设置相应的MiniBatchSize。“详细”假的,...不发送命令行输出。“InitialLearnRate”initialLearnRate,...%设置缩放学习率。“OutputFcn”@(州)sendTrainingProgress (D idx状态),...设置输出函数,将中间结果发送到客户端。“L2Regularization”1平台以及...“MaxEpochs”30岁的...“洗牌”“every-epoch”...“ValidationData”imdsValidation,...“LearnRateSchedule”“分段”...“LearnRateDropFactor”, 0.1,...“LearnRateDropPeriod”25);在集群中的一个worker中训练网络。工人们发送%培训进度信息,在培训期间向客户提供。net = trainNetwork(augmentedImdsTrain,layers,options);%为了获得这个网络的准确性,使用训练过的网络对工人上的验证图像进行分类,并将预测的标签与标签进行比较%实际标签。ypredict =分类(net,imdsValidation);accuracies(idx) = sum(ypredict == imdsValidation.Labels)/numel(imdsValidation.Labels);将训练好的网络发送回客户端。trainedNetworks{idx} = net;结束
分析文件并将文件传输给工作人员…完成。

parforが終了すると,trainedNetworksにはワ,カ,による学習の結果として得られたネットワ,クが含まれます。学習済みネットワ,クとその精度を表示します。

trainedNetworks
trainedNetworks =4×1单元格数组{1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork} {1×1 SeriesNetwork}
精度
精度=4×10.8214 0.8172 0.8132 0.8084

精度に基づいて最適なネットワ,クを選択します。テストデ,タセットに対してそのパフォ,マンスをテストします。

[~, I] = max(精度);bestNetwork = trainedNetworks{I(1)};ypredict = category (bestNetwork,imdsTest);accuracy = sum(ypredict == imdsTest.Labels)/numel(imdsTest.Labels)
准确度= 0.8187

補助関数

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

函数layers = [convolution2dLayer(3,numFilters, numConvLayers)“填充”“相同”) batchNormalizationLayer reluLayer;layers = repmat(layers,numConvLayers,1);结束

DataQueueを通じて学習の進行状況をクラ@ @アントに送信する関数を定義します。

函数sendTrainingProgress (D, idx信息)如果信息。状态= =“迭代”发送(D, {idx、info.Iteration info.TrainingAccuracy});结束结束

ワ,カ,が中間結果を送信したときにプロットを更新する更新関数を定義します。

函数updatePlot(线、idx iter acc) addpoints(直线(idx)、iter acc);drawnowlimitratenocallbacks结束

参考

|(并行计算工具箱)|

関連する例

詳細