主要内容

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

カスタム学習ループを使用したネットワークの学習

この例では,カスタム学習率スケジュールで手書きの数字を分類するネットワークに学習させる方法を示します。

必要なオプション(たとえば,カスタム学習率スケジュール)が関数trainingOptionsに用意されていない場合,自動微分を使用して独自のカスタム学習ループを定義できます。

この例では,“時間ベースの減衰”学習率スケジュールで手書きの数字を分類するようにネットワークに学習させます。各反復で,ソルバーは ρ t ρ 0 1 + k t によって与えられる学習率を使用します。ここで,tは反復回数, ρ 0 は初期学習率,kは減衰です。

学習データの読み込み

関数图像数据存储を使用して数字データをイメージデータストアとして読み込み,イメージデータが格納されているフォルダーを指定します。

dataFolder=fullfile(toolboxdir(“内特”),“nndemos”“nndatasets”“DigitDataset”);imds=图像数据存储(数据文件夹,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

データを学習セットと検証セットに分割します。関数splitEachLabelを使用して,データの10%を検証用に残しておきます。

[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);

この例で使用されるネットワークには、サイズが 28 x 28 x 1の入力イメージが必要です。学習イメージのサイズを自動的に変更するには、拡張イメージ データストアを使用します。学習イメージに対して実行する追加の拡張演算として、イメージを水平軸方向および垂直軸方向に最大 5.ピクセルだけランダムに平行移動させる演算を指定します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

inputSize=[28 28 1];pixelRange=[-5];imageAugmenter=imageDataAugmenter(...“随机翻译”pixelRange,...“RandYTranslation”,pixelRange);augimdsTrain=增强的图像数据存储(inputSize(1:2),imdsTrain,“DataAugmentation”, imageAugmenter);

他のデータ拡張を実行せずに検証イメージのサイズを自動的に変更するには、追加の前処理演算を指定せずに拡張イメージ データストアを使用します。

augimdsValidation=增强图像数据存储(inputSize(1:2),imdsValidation);

学習データ内のクラスの数を決定します。

类=类别(imdsTrain.Labels);numClasses =元素个数(类);

ネットワークの定義

イメージ分類のネットワークを定義します。

层=[imageInputLayer(inputSize,“正常化”“没有”“名字”“输入”)卷积2层(5,20,“名字”“conv1”)批处理规范化层(“名字”“bn1”) reluLayer (“名字”“relu1”)卷积2层(3,20,“填充”“相同”“名字”“conv2”)批处理规范化层(“名字”“bn2”) reluLayer (“名字”“relu2”)卷积2层(3,20,“填充”“相同”“名字”“conv3”)批处理规范化层(“名字”“bn3”) reluLayer (“名字”“relu3”) fullyConnectedLayer (numClasses“名字”“俱乐部”) softmaxLayer (“名字”“softmax”));lgraph = layerGraph(层);

層グラフから数据链路网络オブジェクトを作成します。

dlnet = dlnetwork (lgraph)
dlnet = dlnetwork with properties: Layers: [12×1 net.cnn.layer. layer] Connections: [11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'input'} OutputNames: {'softmax'}

モデル勾配関数の定義

例の最後にリストされている関数模型梯度を作成します。この関数は、数据链路网络オブジェクト,入力データのミニバッチとそれに対応するラベルを受け取り,ネットワークにおける学習可能なパラメーターについての損失の勾配,および対応する損失を返します。

学習オプションの指定

128年ミニバッチサイズをとして10エポック学習させます。

numEpochs = 10;miniBatchSize = 128;

个最適化のオプションを指定します。0.01減衰の初期学習率0.01,およびモーメンタム0.9を指定します。

initialLearnRate = 0.01;衰变= 0.01;动量= 0.9;

モデルの学習

学習中にイメージのミニバッチを処理および管理するminibatchqueueオブジェクトを作成します。各ミニバッチで次を行います。

  • カスタム ミニバッチ前処理関数preprocessMiniBatch(この例の最後に定義)を使用して,ラベルを一个炎热符号化変数に変換します。

  • イメージデータを次元ラベル“SSCB”(空间、空间、通道、批次)で書式設定します。既定では、minibatchqueueオブジェクトは,基となる型が单一的dlarrayオブジェクトにデータを変換します。書式をクラス ラベルに追加しないでください。

  • GPUが利用できる場合,GPUで学習を行います。既定では,minibatchqueueオブジェクトは、GPUが利用可能な場合、各出力をgpuArrayに変換します。GPUを使用するには,并行计算工具箱™,および以3.0计算能力上のCUDA®対応NVIDIA GPU®が必要です。

兆贝可= minibatchqueue (augimdsTrain,...“MiniBatchSize”,小批量,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,{“SSCB”''});

学習の進行状況プロットを初期化します。

figure lineosstrain = animatedline(“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”) ylabel (“损失”)网格

SGDMソルバーの速度パラメーターを初期化します。

速度= [];

カスタム学習ループを使用してネットワークに学習させます。各エポックについて,データをシャッフルしてデータのミニバッチをループで回します。各ミニバッチで次を行います。

  • 関数德尔费瓦尔および模型梯度を使用してモデルの勾配,状態,および損失を評価し,ネットワークの状態を更新。

  • 時間ベースの減衰学習率スケジュールの学習率を決定。

  • 関数sgdmupdateを使用してネットワーク パラメーターを更新します。

  • 学習の進行状況を表示。

迭代=0;开始=tic;%环游各个时代。时代= 1:numEpochs%洗牌数据。洗牌(mbq);%在小批量上循环。hasdata(mbq)迭代=迭代+1;%读取小批量数据。[dlX, dlY] = next(mbq);使用dlfeval和%modelGradients运行并更新网络状态。[gradients,state,loss]=dlfeval(@modelGradients,dlnet,dlX,dlY);dlnet.State=状态;%确定基于时间的衰减学习速率计划的学习速率。learnRate=初始learnRate/(1+衰减*迭代);%使用SGDM优化器更新网络参数。[dlnet,速度]= sgdmupdate (dlnet、渐变速度,learnRate动量);%显示训练进度。D =持续时间(0,0,toc(开始),“格式”“hh:mm:ss”);添加点(lineLossTrain、迭代、丢失)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束

モデルのテスト

真のラベルをもつ検証セットで予測を比較し、モデルの分類精度をテストします。

学習後に新しいデータについて予測を行う際,ラベルは必要ありません。テストデータの予測子のみを含むminibatchqueueオブジェクトを作成します。

  • テスト用のラベルを無視するには,ミニバッチキューの出力数を1に設定します。

  • 学習に使用されるサイズと同じミニバッチサイズを指定します。

  • 例の最後にリストされている関数预处理预测器を使用して予測子を前処理します。

  • データストアの単一の出力では,ミニバッチの形式“SSCB”(空间、空间、通道、批次)を指定します。

numOutputs=1;mbqTest=minibatchqueue(augimdsValidation,numOutputs,...“MiniBatchSize”,小批量,...“MiniBatchFcn”,@预处理预测因子,...“MiniBatchFormat”“SSCB”);

例の最後にリストされている関数模型预测を使用して,ミニバッチをループ処理し,イメージを分類します。

预测=模型预测(dlnet、mbqTest、类);

分類精度を評価します。

YTest=imdsValidation.Labels;精度=平均值(预测==YTest)
精度= 0.9530

モデル勾配関数

関数模型梯度は,数据链路网络オブジェクトdlnet、入力データdlXのミニバッチとそれに対応するラベルYを受け取り,dlnetにおける学習可能なパラメーターについての損失の勾配、ネットワークの状態、および損失を返します。勾配を自動的に計算するには、関数dlgradientを使用します。

函数[gradients,state,loss]=modelGradients(dlnet,dlX,Y)[dlYPred,state]=forward(dlnet,dlX);loss=crossentropy(dlYPred,Y);gradients=dlgradient(loss,dlnet.Learnables);loss=double(收集(提取数据(loss));结束

モデル予測関数

関数模型预测は,数据链路网络オブジェクトdlnet、入力データ兆贝可minibatchqueue,ネットワーククラスを受け取り,minibatchqueueオブジェクトに含まれるすべてのデータを反復処理することによってモデル予測を計算します。この関数は,関数onehotdecodeを使用して,スコアが最も高い予測されたクラスを見つけます。

函数[] = [];hasdata(mbq) dlXTest = next(mbq);dlYPred =预测(dlnet dlXTest);YPred = onehotdecode (dlYPred、类1)';预测=[预测;YPred];结束结束

ミニ バッチ前処理関数

関数preprocessMiniBatchは,次の手順を使用して予測子とラベルのミニバッチを前処理します。

  1. 関数预处理预测器を使用してイメージを前処理します。

  2. 入力电池配列からラベルデータを抽出し,2番目の次元に沿って直言配列に連結します。

  3. カテゴリカル ラベルを数値配列に 一个热的符号化します。最初の次元への符号化は、ネットワーク出力の形状と一致する符号化された配列を生成します。

函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从单元格中提取标签数据并连接。Y=cat(2,YCell{1:end});%一次性编码标签。Y, Y = onehotencode (1);结束

ミニバッチ予測子前処理関数

関数预处理预测器は,入力电池配列からイメージデータを抽出することで予測子のミニバッチを前処理し,数値配列に連結します。グレースケール入力では,4番目の次元で連結することにより,3番目の次元が各イメージに追加されます。この次元は,シングルトンチャネル次元として使用されることになります。

函数X=预处理预测器(XCell)%连接。X=cat(4,XCell{1:end});结束

参考

|||||||||

関連するトピック