Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

dlnetwork

カスタム学習ループ向けの深層学習ネットワーク

R2019b 以降

説明

dlnetwork オブジェクトを使用すると、自動微分を使用するカスタム学習ループをサポートできます。

ヒント

ほとんどの深層学習タスクでは、事前学習済みのニューラル ネットワークを使用して独自のデータに適応させることができます。転移学習を使用して、畳み込みニューラル ネットワークの再学習を行い、新しい一連のイメージを分類する方法を示す例については、新しいイメージを分類するための深層学習ネットワークの学習を参照してください。または、関数 trainnet、関数 trainNetwork、および関数 trainingOptions を使用して、ニューラル ネットワークを作成し、これにゼロから学習させることができます。

タスクに必要な学習オプションが関数 trainingOptions に用意されていない場合、自動微分を使用してカスタム学習ループを作成できます。詳細については、カスタム学習ループ向けの深層学習ネットワークの定義を参照してください。

作成

説明

net = dlnetwork(layers) は、layers で指定されたネットワーク層を、カスタム学習ループで使用するための深層ニューラル ネットワークを表す初期化済みの dlnetwork オブジェクトに変換します。layers には、LayerGraph オブジェクトまたは Layer 配列を使用できます。layers には入力層を含めなければなりません。

初期化済みの dlnetwork オブジェクトは、学習の準備が整っています。net の学習可能パラメーターと状態値は、ネットワークの入力層で定義された入力サイズに基づく初期値を使用して、学習を行えるように初期化されます。

net = dlnetwork(layers,X1,...,Xn) は、ネットワーク データ レイアウト オブジェクトまたはサンプル入力 X1,...,Xn を使用して、初期化された dlnetwork オブジェクトを作成します。net の学習可能なパラメーターと状態値は、X1,...,Xn で定義されたサイズと形式に基づく初期値を使用して初期化されます。入力層に接続されていない入力が存在する初期化済みの dlnetwork を作成するには、この構文を使用します。

net = dlnetwork(layers,'Initialize',tf) は、初期化済みと未初期化の dlnetwork のどちらを返すかを指定します。未初期化のネットワークを作成するには、この構文を使用します。

未初期化のネットワークは、学習可能パラメーターと状態パラメーターに未設定の空の値が含まれており、学習の準備が整っていません。未初期化の dlnetwork を使用するには、これを事前に初期化しなければなりません。後で初期化を行う場合は、未初期化のネットワークを作成します。未初期化の dlnetwork オブジェクトを使用すると、中間の基本ブロックを使用して複雑なネットワークを作成しておき、後から深層学習のネットワーク構成のワークフローなどを使用してそれらを結合することができます。関数 initialize を使用して、未初期化の dlnetwork を初期化できます。

net = dlnetwork(___,'OutputNames',names) は、前述のいずれかの構文を使用して、OutputNames プロパティも設定します。OutputNames プロパティは、ネットワークの出力を返す層を指定します。出力名を設定するには、ネットワークが初期化されていなければなりません。

net = dlnetwork(prunableNet) は、枝刈り用に選択されたフィルターを prunableNet の畳み込み層から削除し、圧縮された (学習可能パラメーターを減らしてサイズを小さくした) dlnetwork オブジェクトを返します。

深層ニューラル ネットワークの枝刈りを行うには、Deep Learning Toolbox™ Model Quantization Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Quantization Library を参照してください。

入力引数

すべて展開する

ネットワーク層。LayerGraph オブジェクトまたは Layer 配列として指定します。

layersLayer 配列の場合、関数 dlnetwork は層を直列に結合します。

ネットワーク層に出力層を含めてはなりません。ネットワークに学習させるときに、損失を別途計算します。

サンプルのネットワーク入力またはデータ レイアウト。書式化された dlarray オブジェクトまたは書式化された networkDataLayout オブジェクトとして指定します。ソフトウェアは、X1,...Xn をネットワーク全体に伝播させて、dlnetwork の学習可能なパラメーターと状態パラメーターの適切なサイズと形式を決定します。

layersLayer 配列の場合、入力を必要とする層が Layer 配列で現れるのと同じ順序でサンプル入力を与えます。layersLayerGraph オブジェクトの場合、入力を必要とする層が LayerGraphLayers プロパティで現れるのと同じ順序でサンプル入力を与えます。

tf が false の場合、サンプル入力はサポートされません。

メモ

自動的な初期化では、入力データのサイズと形式の情報のみが使用されます。入力データの値に基づいて初期化を行う場合、学習可能なパラメーターを手動で初期化しなければなりません。

初期化済みの dlnetwork を返すかどうかのフラグ。数値または logical で 1 (true) または 0 (false) として指定します。

tf1 の場合、ソフトウェアは、ネットワークの入力層または与えられたサンプル入力に基づき、学習用の初期値を使用して net の学習可能パラメーターと状態パラメーターを初期化します。

tf0 の場合、ソフトウェアは、学習可能パラメーターと状態パラメーターを初期化しません。未初期化のネットワークを使用するには、関数 initialize を使用して最初に初期化しなければなりません。tf が false の場合、サンプル入力はサポートされません。

1 次テイラー近似を使用した枝刈り用のネットワーク。TaylorPrunableNetwork オブジェクトとして指定します。

プロパティ

すべて展開する

この プロパティ は読み取り専用です。

ネットワーク層。Layer 配列として指定します。

この プロパティ は読み取り専用です。

層の結合。2 列の table として指定します。

各 table 行は層グラフの結合を表します。1 列目の Source は、各結合の結合元を指定します。2 列目の Destination は、各結合の結合先を指定します。結合元と結合先は層の名前であるか、'layerName/IOName' の形式を取ります。'IOName' は層の入力または出力の名前です。

データ型: table

ネットワークの学習可能パラメーター。3 列の table として指定します。

  • Layer – 層の名前。string スカラーとして指定します。

  • Parameter – パラメーターの名前。string スカラーとして指定します。

  • Value – パラメーターの値。dlarray オブジェクトとして指定します。

ネットワークの学習可能パラメーターには、ネットワークが学習した特徴が格納されます。たとえば、畳み込み層や全結合層の重みが格納されます。

データ型: table

ネットワークの状態。table として指定します。

ネットワークの状態は、次の 3 つの列をもつ table です。

  • Layer – 層の名前。string スカラーとして指定します。

  • Parameter – 状態パラメーターの名前。string スカラーとして指定します。

  • Value – 状態パラメーターの値。dlarray オブジェクトとして指定します。

層の状態には、層処理中に計算された情報が格納されます。この情報は、層の後続のフォワード パスで使用するために保持されます。たとえば、LSTM 層のセル状態と隠れ状態、またはバッチ正規化層の実行中の統計が格納されます。

LSTM 層などの再帰層の場合、HasStateInputs プロパティを 1 (true) に設定すると、その層の状態に関するエントリはステート table に格納されません。

学習時または推論時に、関数 forward および関数 predict の出力を使用してネットワークの状態を更新できます。

データ型: table

この プロパティ は読み取り専用です。

ネットワーク入力の名前。文字ベクトルの cell 配列として指定します。

ネットワーク入力は、入力層および層の未接続入力です。

入力層および 1 つの入力をもつ層の場合、入力の名前は層の名前です。複数の入力をもつ層の場合、入力の名前は 'layerName/inputName' です。ここで、layerName は層の名前、inputName は層の入力の名前です。

データ型: cell

ネットワーク出力の名前。文字ベクトルの cell 配列として指定します。

1 つの出力をもつ層の場合、出力の名前は層の名前です。複数の出力をもつ層の場合、入力の名前は 'layerName/outputName' です。ここで、layerName は層の名前、outputName は層の出力の名前です。

出力名を指定しない場合、ソフトウェアは、OutputNames プロパティを未接続の出力をもつ層に設定します。

関数 predict および関数 forward は、既定では OutputNames プロパティで指定された層によって出力されたデータを返します。

データ型: cell

この プロパティ は読み取り専用です。

ネットワークが初期化済みかどうかのフラグ。0 (false) または 1 (true) として指定します。

Initialized0 (false) の場合、ネットワークは初期化されていません。未初期化のネットワークを使用するには、事前に初期化しなければなりません。関数 initialize を使用してネットワークを初期化します。

Initialized1 (true) の場合、ネットワークは初期化されており、学習や推論に使用することができます。学習時などに学習可能パラメーターの値を変更した場合、Initialized の値は 1 (true) のままになります。

データ型: logical

オブジェクト関数

predict推論用の深層学習ネットワーク出力の計算
forward学習用の深層学習ネットワーク出力の計算
initializedlnetwork の学習可能なパラメーターと状態パラメーターの初期化
layerGraph深層学習用のネットワーク層のグラフ
setL2Factor層の学習可能なパラメーターの L2 正則化係数の設定
setLearnRateFactor層の学習可能なパラメーターの学習率係数を設定します。
getLearnRateFactor層の学習可能なパラメーターの学習率係数の取得
getL2Factor層の学習可能なパラメーターの L2 正則化係数の取得
resetStateニューラル ネットワークの状態パラメーターのリセット
plotニューラル ネットワーク アーキテクチャのプロット
addInputLayerAdd input layer to network
addLayers層グラフまたはネットワークへの層の追加
removeLayers層グラフまたはネットワークからの層の削除
connectLayers層グラフまたはネットワークの層の結合
disconnectLayers層グラフまたはネットワークの層の切り離し
replaceLayer層グラフまたはネットワークの層の置き換え
summaryネットワークの概要の出力

すべて折りたたむ

ネットワーク用のカスタム学習ループを実装するには、まず、ネットワークを dlnetwork オブジェクトに変換します。出力層を dlnetwork オブジェクトに含めないでください。代わりに、カスタム学習ループ内で損失関数を指定してください。

関数 googlenet を使用して事前学習済みの GoogLeNet モデルを読み込みます。この関数には、Deep Learning Toolbox™ Model for GoogLeNet Network サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、関数によってダウンロード用リンクが表示されます。

net = googlenet;

ネットワークを層グラフに変換し、removeLayers を使用して分類用の層を削除します。

lgraph = layerGraph(net);
lgraph = removeLayers(lgraph,["prob" "output"]);

ネットワークを dlnetwork オブジェクトに変換します。

dlnet = dlnetwork(lgraph)
dlnet = 
  dlnetwork with properties:

         Layers: [142x1 nnet.cnn.layer.Layer]
    Connections: [168x2 table]
     Learnables: [116x3 table]
          State: [0x3 table]
     InputNames: {'data'}
    OutputNames: {'loss3-classifier'}
    Initialized: 1

  View summary with summary.

ネットワーク データ レイアウト オブジェクトを使用して、学習の準備が整った多入力の dlnetwork を作成します。ソフトウェアは、サイズと形式の情報を使用して、dlnetwork の学習可能なパラメーターと状態パラメーターの適切なサイズと形式を決定します。

ネットワーク アーキテクチャを定義します。2 つの分岐をもつネットワークを構築します。このネットワークは 2 つの入力を取ります (各分岐から入力を 1 つずつ取ります)。加算層を使用して分岐を接続します。

numFilters = 24;

layersBranch1 = [
    convolution2dLayer(3,6*numFilters,Padding="same",Stride=2)
    groupNormalizationLayer("all-channels")
    reluLayer
    convolution2dLayer(3,numFilters,Padding="same")
    groupNormalizationLayer("channel-wise")
    additionLayer(2,Name="add")
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer];

layersBranch2 = [
    convolution2dLayer(1,numFilters)
    groupNormalizationLayer("all-channels",Name="gnBranch2")];

lgraph = layerGraph(layersBranch1);
lgraph = addLayers(lgraph,layersBranch2);
lgraph = connectLayers(lgraph,"gnBranch2","add/in2");

標準的なネットワーク入力のサイズと形式を表すネットワーク データ レイアウト オブジェクトを作成します。どちらの入力もバッチ サイズは 32 とします。最初の分岐に含まれる畳み込み層には、3 つのチャネルをもつ 64 行 64 列のサイズの入力を使用します。2 番目の分岐に含まれる畳み込み層には、18 個のチャネルをもつ 32 行 32 列のサイズの入力を使用します。

X1 = dlarray(rand([64 64 3 32]),"SSCB");
X2 = dlarray(rand([32 32 18 32]),"SSCB");

dlnetwork を作成します。未結合の層が lgraphLayers プロパティで現れるのと同じ順序で入力を与えます。

net = dlnetwork(lgraph,X1,X2);

ネットワークの Initialized プロパティを検査し、ネットワークが初期化されていて学習の準備が整っていることを確認します。

net.Initialized
ans = logical
   1

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

ほとんどのタイプのニューラル ネットワークは、関数trainNetworkと関数trainingOptionsを使用して学習させることができます。必要なオプション (たとえば、カスタム学習率スケジュール) が関数 trainingOptions に用意されていない場合、自動微分のために dlarray オブジェクトと dlnetwork オブジェクトを使用して独自のカスタム学習ループを定義できます。関数 trainNetwork を使用して事前学習済みの深層学習ネットワークに再学習させる方法を示す例については、事前学習済みのネットワークを使用した転移学習を参照してください。

深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 f(X;θ) と見なすことにより (ここで、X はネットワーク入力、θ は学習可能なパラメーターのセット)、θ を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 X と対応するターゲット T に対して、予測 Y=f(X;θ)T の間の誤差が最小になるように、学習可能なパラメーター θ を最適化します。

使用される損失関数は、タスクのタイプによって異なります。次に例を示します。

  • 分類タスクの場合、予測とターゲットの間のクロス エントロピー誤差を最小化できます。

  • 回帰タスクの場合、予測とターゲットの間の平均二乗誤差を最小化できます。

勾配降下法を使用して目的を最適化できます。勾配降下法では、学習可能なパラメーターについての損失の勾配を使用して最小化に向けてステップを実行することで、学習可能なパラメーター θ を反復的に更新することにより、損失 L を最小化します。勾配降下法アルゴリズムは通常、θt+1=θt-ρL の形式の更新ステップのバリアントを使用して、学習可能なパラメーターを更新します。ここで、t は反復回数、ρ は学習率、L は勾配 (学習可能なパラメーターについての損失の微分) を表します。

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

学習データの読み込み

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

unzip("DigitsData.zip")

imds = imageDatastore("DigitsData", ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

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

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9,"randomize");

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

inputSize = [28 28 1];
pixelRange = [-5 5];

imageAugmenter = imageDataAugmenter( ...
    RandXTranslation=pixelRange, ...
    RandYTranslation=pixelRange);

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain,DataAugmentation=imageAugmenter);

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

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

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

classes = categories(imdsTrain.Labels);
numClasses = numel(classes);

ネットワークの定義

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

  • イメージ入力用に、学習データと一致する入力サイズのイメージ入力層を指定します。

  • イメージ入力は正規化せず、入力層の Normalization オプションを "none" に設定します。

  • convolution-batchnorm-ReLU ブロックを 3 つ指定します。

  • Padding オプションを "same" に設定して、出力が同じサイズになるように畳み込み層に入力をパディングします。

  • 最初の畳み込み層には、サイズ 5 のフィルターを 20 個指定します。残りの畳み込み層には、サイズ 3 のフィルターを 20 個指定します。

  • 分類用に、クラスの数と一致するサイズの全結合層を指定します。

  • 出力を確率にマッピングするために、ソフトマックス層を含めます。

カスタム学習ループを使用してネットワークに学習させる場合、出力層は含めません。

layers = [
    imageInputLayer(inputSize,Normalization="none")
    convolution2dLayer(5,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,20,Padding="same")
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numClasses)
    softmaxLayer];

層配列から dlnetwork オブジェクトを作成します。

net = dlnetwork(layers)
net = 
  dlnetwork with properties:

         Layers: [12×1 nnet.cnn.layer.Layer]
    Connections: [11×2 table]
     Learnables: [14×3 table]
          State: [6×3 table]
     InputNames: {'imageinput'}
    OutputNames: {'softmax'}
    Initialized: 1

  View summary with summary.

モデル損失関数の定義

深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 f(X;θ) と見なすことにより (ここで、X はネットワーク入力、θ は学習可能なパラメーターのセット)、θ を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 X と対応するターゲット T に対して、予測 Y=f(X;θ)T の間の誤差が最小になるように、学習可能なパラメーター θ を最適化します。

例のモデル損失関数の節にリストされている関数 modelLoss を作成します。この関数は、dlnetwork オブジェクト、入力データのミニバッチと対応するターゲットを入力として受け取り、学習可能なパラメーターについての損失と損失の勾配、およびネットワークの状態を返します。

学習オプションの指定

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

numEpochs = 10;
miniBatchSize = 128;

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

initialLearnRate = 0.01;
decay = 0.01;
momentum = 0.9;

モデルの学習

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

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

  • イメージ データを次元ラベル "SSCB" (spatial、spatial、channel、batch) で書式設定します。既定では、minibatchqueue オブジェクトは、基となる型が singledlarray オブジェクトにデータを変換します。クラス ラベルは書式設定しません。

  • 部分的なミニバッチは破棄します。

  • GPU が利用できる場合、GPU で学習を行います。既定では、minibatchqueue オブジェクトは、GPU が利用可能な場合、各出力を gpuArray に変換します。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

mbq = minibatchqueue(augimdsTrain,...
    MiniBatchSize=miniBatchSize,...
    MiniBatchFcn=@preprocessMiniBatch,...
    MiniBatchFormat=["SSCB" ""], ...
    PartialMiniBatch="discard");

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

velocity = [];

学習の進行状況モニター用に合計反復回数を計算します。

numObservationsTrain = numel(imdsTrain.Files);
numIterationsPerEpoch = floor(numObservationsTrain / miniBatchSize);
numIterations = numEpochs * numIterationsPerEpoch;

TrainingProgressMonitor オブジェクトを初期化します。monitor オブジェクトを作成するとタイマーが開始されるため、学習ループに近いところでオブジェクトを作成するようにしてください。

monitor = trainingProgressMonitor( ...
    Metrics="Loss", ...
    Info=["Epoch" "LearnRate"], ...
    XLabel="Iteration");

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

  • 関数 dlfeval と関数 modelLoss を使用してモデルの損失、勾配、および状態を評価し、ネットワークの状態を更新します。

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

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

  • 学習の進行状況モニターで、損失、学習率、およびエポックの値を更新します。

  • Stop プロパティが true の場合は停止します。[停止] ボタンをクリックすると、TrainingProgressMonitor オブジェクトの Stop プロパティ値が true に変わります。

epoch = 0;
iteration = 0;

% Loop over epochs.
while epoch < numEpochs && ~monitor.Stop
    
    epoch = epoch + 1;

    % Shuffle data.
    shuffle(mbq);
    
    % Loop over mini-batches.
    while hasdata(mbq) && ~monitor.Stop

        iteration = iteration + 1;
        
        % Read mini-batch of data.
        [X,T] = next(mbq);
        
        % Evaluate the model gradients, state, and loss using dlfeval and the
        % modelLoss function and update the network state.
        [loss,gradients,state] = dlfeval(@modelLoss,net,X,T);
        net.State = state;
        
        % Determine learning rate for time-based decay learning rate schedule.
        learnRate = initialLearnRate/(1 + decay*iteration);
        
        % Update the network parameters using the SGDM optimizer.
        [net,velocity] = sgdmupdate(net,gradients,velocity,learnRate,momentum);
        
        % Update the training progress monitor.
        recordMetrics(monitor,iteration,Loss=loss);
        updateInfo(monitor,Epoch=epoch,LearnRate=learnRate);
        monitor.Progress = 100 * iteration/numIterations;
    end
end

モデルのテスト

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

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

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

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

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

  • データストアの単一の出力では、ミニバッチの形式 "SSCB" (spatial、spatial、channel、batch) を指定します。

numOutputs = 1;

mbqTest = minibatchqueue(augimdsValidation,numOutputs, ...
    MiniBatchSize=miniBatchSize, ...
    MiniBatchFcn=@preprocessMiniBatchPredictors, ...
    MiniBatchFormat="SSCB");

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

YTest = modelPredictions(net,mbqTest,classes);

分類精度を評価します。

TTest = imdsValidation.Labels;
accuracy = mean(TTest == YTest)
accuracy = 0.9220

混同チャートで予測を可視化します。

figure
confusionchart(TTest,YTest)

対角線上の大きな値は、対応するクラスに対する正確な予測を示しています。対角線外の大きな値は、対応するクラス間での強い混同を示しています。

サポート関数

モデル損失関数

関数 modelLoss は、dlnetwork オブジェクト net、入力データのミニバッチ X とそれに対応するターゲット T を受け取り、net 内の学習可能パラメーターについての損失と損失の勾配、およびネットワークの状態を返します。勾配を自動的に計算するには、関数 dlgradient を使用します。

function [loss,gradients,state] = modelLoss(net,X,T)

% Forward data through network.
[Y,state] = forward(net,X);

% Calculate cross-entropy loss.
loss = crossentropy(Y,T);

% Calculate gradients of loss with respect to learnable parameters.
gradients = dlgradient(loss,net.Learnables);

end

モデル予測関数

関数 modelPredictions は、dlnetwork オブジェクト net、入力データの minibatchqueue オブジェクト mbq、およびネットワーク クラスを受け取り、minibatchqueue オブジェクトに含まれるすべてのデータを反復処理することによってモデル予測を計算します。この関数は、関数 onehotdecode を使用して、スコアが最も高い予測されたクラスを見つけます。

function Y = modelPredictions(net,mbq,classes)

Y = [];

% Loop over mini-batches.
while hasdata(mbq)
    X = next(mbq);

    % Make prediction.
    scores = predict(net,X);

    % Decode labels and append to output.
    labels = onehotdecode(scores,classes,1)';
    Y = [Y; labels];
end

end

ミニ バッチ前処理関数

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

  1. 関数 preprocessMiniBatchPredictors を使用してイメージを前処理します。

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

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

function [X,T] = preprocessMiniBatch(dataX,dataT)

% Preprocess predictors.
X = preprocessMiniBatchPredictors(dataX);

% Extract label data from cell and concatenate.
T = cat(2,dataT{1:end});

% One-hot encode labels.
T = onehotencode(T,1);

end

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

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

function X = preprocessMiniBatchPredictors(dataX)

% Concatenate.
X = cat(4,dataX{1:end});

end

事前学習済みのネットワークを読み込みます。

net = squeezenet;

ネットワークを層グラフに変換し、出力層を削除して、dlnetwork オブジェクトに変換します。

lgraph = layerGraph(net);
lgraph = removeLayers(lgraph,'ClassificationLayer_predictions');
dlnet = dlnetwork(lgraph);

dlnetwork オブジェクトの Learnables プロパティは、ネットワークの学習可能なパラメーターが格納された table です。この table には、入れ子層のパラメーターが別々の行に含まれています。このテーブル learnables の最初の数行を表示します。

learnables = dlnet.Learnables;
head(learnables)
          Layer           Parameter           Value       
    __________________    _________    ___________________

    "conv1"               "Weights"    {3x3x3x64  dlarray}
    "conv1"               "Bias"       {1x1x64    dlarray}
    "fire2-squeeze1x1"    "Weights"    {1x1x64x16 dlarray}
    "fire2-squeeze1x1"    "Bias"       {1x1x16    dlarray}
    "fire2-expand1x1"     "Weights"    {1x1x16x64 dlarray}
    "fire2-expand1x1"     "Bias"       {1x1x64    dlarray}
    "fire2-expand3x3"     "Weights"    {3x3x16x64 dlarray}
    "fire2-expand3x3"     "Bias"       {1x1x64    dlarray}

ネットワークの学習可能なパラメーターを凍結するには、学習可能なパラメーターをループ処理し、関数 setLearnRateFactor を使用して学習率を 0 に設定します。

factor = 0;

numLearnables = size(learnables,1);
for i = 1:numLearnables
    layerName = learnables.Layer(i);
    parameterName = learnables.Parameter(i);
    
    dlnet = setLearnRateFactor(dlnet,layerName,parameterName,factor);
end

更新された学習率係数を学習時に使用するには、カスタム学習ループの更新関数に dlnetwork オブジェクトを渡さなければなりません。たとえば、次のコマンドを使用します。

[dlnet,velocity] = sgdmupdate(dlnet,gradients,velocity);

入力層をもたない未初期化の dlnetwork オブジェクトを作成します。カスタム層の内部で dlnetwork が入れ子になっている場合のように、ネットワーク入力のサイズと形式がわからない場合、未初期化の dlnetwork を作成すると便利です。

ネットワーク層を定義します。このネットワークには単一の入力があり、これは入力層に接続されていません。

layers = [
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer];

未初期化の dlnetwork を作成します。Initialize オプションを false に設定します。

dlnet = dlnetwork(layers,'Initialize',false);

ネットワークが初期化されていないことを確認します。

dlnet.Initialized
ans = logical
   0

このネットワークの学習可能パラメーターと状態パラメーターは、学習用に初期化されていません。ネットワークを初期化するには、関数initializeを使用します。

カスタム学習ループ内で dlnet を直接使用する場合は、関数initializeを使用して初期化を行い、サンプル入力を与えることができます。

カスタム層の内部で dlnet を使用する場合は、自動的な初期化を利用できます。dlnetwork の内部でカスタム層を使用する場合、親の dlnetwork を構築したときに (または、未初期化の dlnetwork として構築した親ネットワークを初期化したときに)、dlnet が初期化されます。関数 trainNetwork を使用して学習させたネットワークの内部でカスタム層を使用する場合は、学習時に dlnet が自動的に初期化されます。詳細については、深層学習のネットワーク構成を参照してください。

拡張機能

バージョン履歴

R2019b で導入

すべて展開する