dlnetwork
カスタム学習ループ向けの深層学習ネットワーク
説明
dlnetwork
オブジェクトを使用すると、自動微分を使用するカスタム学習ループをサポートできます。
ヒント
ほとんどの深層学習タスクでは、事前学習済みのネットワークを使用して独自のデータに適応させることができます。転移学習を使用して、畳み込みニューラル ネットワークの再学習を行い、新しい一連のイメージを分類する方法を示す例については、新しいイメージを分類するための深層学習ネットワークの学習を参照してください。または、layerGraph
オブジェクトを関数 trainNetwork
および関数 trainingOptions
と共に使用して、ネットワークを作成してゼロから学習させることができます。
タスクに必要な学習オプションが関数 trainingOptions
に用意されていない場合、自動微分を使用してカスタム学習ループを作成できます。詳細については、カスタム学習ループ向けの深層学習ネットワークの定義を参照してください。
作成
構文
説明
は、net
= dlnetwork(layers
)layers
で指定されたネットワーク層を、カスタム学習ループで使用するための深層ニューラル ネットワークを表す初期化済みの dlnetwork
オブジェクトに変換します。layers
には、LayerGraph
オブジェクトまたは Layer
配列を使用できます。layers
には入力層を含めなければなりません。
初期化済みの dlnetwork
オブジェクトは、学習の準備が整っています。net
の学習可能パラメーターと状態値は、ネットワークの入力層で定義された入力サイズに基づく初期値を使用して、学習を行えるように初期化されます。
は、初期化済みと未初期化の 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 を参照してください。
入力引数
layers
— ネットワーク層
LayerGraph
オブジェクト | Layer
配列
ネットワーク層。LayerGraph
オブジェクトまたは Layer
配列として指定します。
layers
が Layer
配列の場合、関数 dlnetwork
は層を直列に結合します。
ネットワーク層に出力層を含めてはなりません。ネットワークに学習させるときに、損失を別途計算します。
dlnetwork
によってサポートされている層の一覧については、サポートされている層を参照してください。
X1,...,Xn
— サンプルのネットワーク入力またはデータ レイアウト
書式化された dlarray
オブジェクト | 書式化された networkDataLayout
オブジェクト
サンプルのネットワーク入力またはデータ レイアウト。書式化された dlarray
オブジェクトまたは書式化された networkDataLayout
オブジェクトとして指定します。ソフトウェアは、X1,...Xn
をネットワーク全体に伝播させて、dlnetwork
の学習可能なパラメーターと状態パラメーターの適切なサイズと形式を決定します。
layers
が Layer
配列の場合、入力を必要とする層が Layer
配列で現れるのと同じ順序でサンプル入力を与えます。layers
が LayerGraph
オブジェクトの場合、入力を必要とする層が LayerGraph
の Layers
プロパティで現れるのと同じ順序でサンプル入力を与えます。
tf
が false の場合、サンプル入力はサポートされません。
メモ
自動的な初期化では、入力データのサイズと形式の情報のみが使用されます。入力データの値に基づいて初期化を行う場合、学習可能なパラメーターを手動で初期化しなければなりません。
tf
— 初期化済みの dlnetwork
を返すかどうかのフラグ
1
(true) (既定値) | 0
(false)
初期化済みの dlnetwork
を返すかどうかのフラグ。数値または logical で 1
(true) または 0
(false) として指定します。
tf
が 1
の場合、ソフトウェアは、ネットワークの入力層または与えられたサンプル入力に基づき、学習用の初期値を使用して net
の学習可能パラメーターと状態パラメーターを初期化します。
tf
が 0
の場合、ソフトウェアは、学習可能パラメーターと状態パラメーターを初期化しません。未初期化のネットワークを使用するには、関数 initialize
を使用して最初に初期化しなければなりません。tf
が false の場合、サンプル入力はサポートされません。
prunableNet
— 1 次テイラー近似を使用した枝刈り用のネットワーク
TaylorPrunableNetwork
オブジェクト
1 次テイラー近似を使用した枝刈り用のネットワーク。TaylorPrunableNetwork
オブジェクトとして指定します。
プロパティ
Layers
— ネットワーク層
Layer
配列
このプロパティは読み取り専用です。
ネットワーク層。Layer
配列として指定します。
Connections
— 層の結合
table
このプロパティは読み取り専用です。
層の結合。2 列の table として指定します。
各 table 行は層グラフの結合を表します。1 列目の Source
は、各結合の結合元を指定します。2 列目の Destination
は、各結合の結合先を指定します。結合元と結合先は層の名前であるか、'layerName/IOName'
の形式を取ります。'IOName'
は層の入力または出力の名前です。
データ型: table
Learnables
— ネットワークの学習可能パラメーター
table
ネットワークの学習可能パラメーター。3 列の table として指定します。
Layer
– 層の名前。string スカラーとして指定します。Parameter
– パラメーターの名前。string スカラーとして指定します。Value
– パラメーターの値。dlarray
オブジェクトとして指定します。
ネットワークの学習可能パラメーターには、ネットワークが学習した特徴が格納されます。たとえば、畳み込み層や全結合層の重みが格納されます。
データ型: table
State
— ネットワークの状態
table
ネットワークの状態。table として指定します。
ネットワークの状態は、次の 3 つの列をもつ table です。
Layer
– 層の名前。string スカラーとして指定します。Parameter
– 状態パラメーターの名前。string スカラーとして指定します。Value
– 状態パラメーターの値。dlarray
オブジェクトとして指定します。
層の状態には、層処理中に計算された情報が格納されます。この情報は、層の後続のフォワード パスで使用するために保持されます。たとえば、LSTM 層のセル状態と隠れ状態、またはバッチ正規化層の実行中の統計が格納されます。
LSTM 層などの再帰層の場合、HasStateInputs
プロパティを 1
(true) に設定すると、その層の状態に関するエントリはステート table に格納されません。
学習時または推論時に、関数 forward
および関数 predict
の出力を使用してネットワークの状態を更新できます。
データ型: table
InputNames
— ネットワーク入力層の名前
文字ベクトルの cell 配列
このプロパティは読み取り専用です。
ネットワーク入力層の名前。文字ベクトルの cell 配列として指定します。
データ型: cell
OutputNames
— ネットワークの出力を返す層の名前
文字ベクトルの cell 配列 | string 配列
ネットワークの出力を返す層の名前。文字ベクトルの cell 配列、または string 配列として指定します。
出力名を設定するには、ネットワークが初期化されていなければなりません。
出力名を指定しない場合、ソフトウェアは、OutputNames
プロパティを出力の接続が解除された層に設定します。層が複数の出力をもつ場合、接続が解除された出力は 'layerName/outputName'
として指定されます。
関数 predict
および関数 forward
は、既定では OutputNames
プロパティで指定された層によって出力されたデータを返します。
データ型: cell
| string
Initialized
— ネットワークが初期化済みかどうかのフラグ
0
(false) | 1
(true)
このプロパティは読み取り専用です。
ネットワークが初期化済みかどうかのフラグ。0
(false) または 1
(true) として指定します。
Initialized
が 0
(false) の場合、ネットワークは初期化されていません。未初期化のネットワークを使用するには、事前に初期化しなければなりません。関数 initialize
を使用してネットワークを初期化します。
Initialized
が 1
(true) の場合、ネットワークは初期化されており、学習や推論に使用することができます。学習時などに学習可能パラメーターの値を変更した場合、Initialized
の値は 1
(true) のままになります。
データ型: logical
オブジェクト関数
predict | 推論用の深層学習ネットワーク出力の計算 |
forward | 学習用の深層学習ネットワーク出力の計算 |
initialize | dlnetwork の学習可能なパラメーターと状態パラメーターの初期化 |
layerGraph | 深層学習用のネットワーク層のグラフ |
setL2Factor | 層の学習可能なパラメーターの L2 正則化係数の設定 |
setLearnRateFactor | 層の学習可能なパラメーターの学習率係数を設定します。 |
getLearnRateFactor | 層の学習可能なパラメーターの学習率係数の取得 |
getL2Factor | 層の学習可能なパラメーターの L2 正則化係数の取得 |
resetState | ニューラル ネットワークの状態パラメーターのリセット |
plot | ニューラル ネットワーク アーキテクチャのプロット |
addInputLayer | Add input layer to network |
addLayers | Add layers to layer graph or network |
removeLayers | 層グラフまたはネットワークからの層の削除 |
connectLayers | 層グラフまたはネットワークの層の結合 |
disconnectLayers | 層グラフまたはネットワークの層の切り離し |
replaceLayer | 層グラフまたはネットワークの層の置き換え |
summary | Print network summary |
例
事前学習済みのネットワークから dlnetwork
オブジェクトへの変換
ネットワーク用のカスタム学習ループを実装するには、まず、ネットワークを 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
を作成します。ソフトウェアは、サイズと形式の情報を使用して、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 個のチャネルをもつ 64 行 64 列のサイズの入力を使用します。
X1 = dlarray(rand([64 64 3 32]),"SSCB"); X2 = dlarray(rand([32 32 18 32]),"SSCB");
dlnetwork
を作成します。未結合の層が lgraph
の Layers
プロパティで現れるのと同じ順序で入力を与えます。
net = dlnetwork(lgraph,X1,X2);
ネットワークの Initialized
プロパティを検査し、ネットワークが初期化されていて学習の準備が整っていることを確認します。
net.Initialized
ans = logical
1
カスタム学習ループを使用したネットワークの学習
この例では、カスタム学習率スケジュールで手書きの数字を分類するネットワークに学習させる方法を示します。
ほとんどのタイプのニューラル ネットワークは、関数trainNetwork
と関数trainingOptions
を使用して学習させることができます。必要なオプション (たとえば、カスタム学習率スケジュール) が関数 trainingOptions
に用意されていない場合、自動微分のために dlarray
オブジェクトと dlnetwork
オブジェクトを使用して独自のカスタム学習ループを定義できます。関数 trainNetwork
を使用して事前学習済みの深層学習ネットワークに再学習させる方法を示す例については、事前学習済みのネットワークを使用した転移学習を参照してください。
深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 と見なすことにより (ここで、 はネットワーク入力、 は学習可能なパラメーターのセット)、 を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 と対応するターゲット に対して、予測 と の間の誤差が最小になるように、学習可能なパラメーター を最適化します。
使用される損失関数は、タスクのタイプによって異なります。次に例を示します。
分類タスクの場合、予測とターゲットの間のクロス エントロピー誤差を最小化できます。
回帰タスクの場合、予測とターゲットの間の平均二乗誤差を最小化できます。
勾配降下法を使用して目的を最適化できます。勾配降下法では、学習可能なパラメーターについての損失の勾配を使用して最小化に向けてステップを実行することで、学習可能なパラメーター を反復的に更新することにより、損失 を最小化します。勾配降下法アルゴリズムは通常、 の形式の更新ステップのバリアントを使用して、学習可能なパラメーターを更新します。ここで、 は反復回数、 は学習率、 は勾配 (学習可能なパラメーターについての損失の微分) を表します。
この例では、"時間ベースの減衰" 学習率スケジュールで手書きの数字を分類するようにネットワークに学習させます。各反復で、ソルバーは によって与えられる学習率を使用します。ここで、t は反復回数、 は初期学習率、k は減衰です。
学習データの読み込み
関数 imageDatastore
を使用して数字データをイメージ データストアとして読み込み、イメージ データが格納されているフォルダーを指定します。
dataFolder = fullfile(toolboxdir("nnet"),"nndemos","nndatasets","DigitDataset"); imds = imageDatastore(dataFolder, ... 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.
モデル損失関数の定義
深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 と見なすことにより (ここで、 はネットワーク入力、 は学習可能なパラメーターのセット)、 を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 と対応するターゲット に対して、予測 と の間の誤差が最小になるように、学習可能なパラメーター を最適化します。
例のモデル損失関数の節にリストされている関数 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
オブジェクトは、基となる型がsingle
のdlarray
オブジェクトにデータを変換します。クラス ラベルは書式設定しません。GPU が利用できる場合、GPU で学習を行います。既定では、
minibatchqueue
オブジェクトは、GPU が利用可能な場合、各出力をgpuArray
に変換します。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
mbq = minibatchqueue(augimdsTrain,... MiniBatchSize=miniBatchSize,... MiniBatchFcn=@preprocessMiniBatch,... MiniBatchFormat=["SSCB" ""]);
SGDM ソルバーの速度パラメーターを初期化します。
velocity = [];
学習の進行状況モニター用に合計反復回数を計算します。
numObservationsTrain = numel(imdsTrain.Files); numIterationsPerEpoch = ceil(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.9750
混同チャートで予測を可視化します。
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
は、次の手順を使用して予測子とラベルのミニバッチを前処理します。
関数
preprocessMiniBatchPredictors
を使用してイメージを前処理します。入力 cell 配列からラベル データを抽出し、2 番目の次元に沿って categorical 配列に連結します。
カテゴリカル ラベルを数値配列に 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
dlnetwork
オブジェクトの学習可能なパラメーターの凍結
事前学習済みのネットワークを読み込みます。
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
が入れ子になっている場合のように、ネットワーク入力のサイズと形式がわからない場合、未初期化の 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
が自動的に初期化されます。詳細については、深層学習のネットワーク構成を参照してください。
詳細
サポートされている層
関数 dlnetwork
は、以下に示す層、および空でないメモリ値を返す順方向関数をもたないカスタム層をサポートします。
層 | 説明 |
---|---|
イメージ入力層は、ネットワークに 2 次元イメージを入力し、データ正規化を適用します。 | |
3 次元イメージ入力層は、ネットワークに 3 次元イメージまたは 3 次元ボリュームを入力し、データ正規化を適用します。 | |
シーケンス入力層は、ネットワークにシーケンス データを入力します。 | |
特徴入力層は、特徴データをネットワークに入力し、データ正規化を適用します。特徴 (空間次元または時間次元のないデータ) を表す数値スカラーのデータ セットがある場合は、この層を使用します。 |
層 | 説明 |
---|---|
1 次元畳み込み層は、1 次元入力にスライディング畳み込みフィルターを適用します。 | |
2 次元畳み込み層は、2 次元入力にスライディング畳み込みフィルターを適用します。 | |
3 次元畳み込み層は、3 次元入力にスライディング直方体畳み込みフィルターを適用します。 | |
グループ化された 2 次元畳み込み層は、入力チャネルをグループに分けて、スライディング畳み込みフィルターを適用します。チャネル方向に分離可能な (深さ方向に分離可能とも呼ばれる) 畳み込みには、グループ化された畳み込み層を使用します。 | |
2 次元転置畳み込み層では 2 次元の特徴マップがアップサンプリングされます。 | |
3 次元転置畳み込み層では 3 次元の特徴マップがアップサンプリングされます。 | |
全結合層は、入力に重み行列を乗算し、バイアス ベクトルを加算します。 |
層 | 説明 |
---|---|
シーケンス入力層は、ネットワークにシーケンス データを入力します。 | |
LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習します。 | |
LSTM 投影層は、投影された学習可能な重みを使用して、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習します。 | |
双方向 LSTM (BiLSTM) 層は、時系列データまたはシーケンス データのタイム ステップ間の双方向の長期的な依存関係を学習します。これらの依存関係は、各タイム ステップで時系列全体からネットワークに学習させる場合に役立ちます。 | |
GRU 層は、時系列データおよびシーケンス データのタイム ステップ間の依存関係を学習します。 | |
フラット化層は、入力の空間次元を折りたたんでチャネルの次元にします。 |
lstmLayer
オブジェクト、bilstmLayer
オブジェクト、および gruLayer
オブジェクトの場合、dlnetwork
オブジェクトは、StateActivationFunction
プロパティおよび GateActivationFunction
プロパティに既定値が設定された層をサポートします。
層 | 説明 |
---|---|
ReLU 層は、入力の各要素に対してしきい値処理を実行し、値がゼロよりも小さい場合はゼロに設定します。 | |
leaky ReLU 層は、しきい値処理を実行し、入力値がゼロよりも小さい場合は固定のスカラーによって乗算します。 | |
クリップされた ReLU 層は、しきい値処理を実行し、入力値がゼロよりも小さい場合はゼロに設定して、値が "クリップ上限" を超える場合はそのクリップ上限に設定します。 | |
ELU 活性化層は、正の入力に対して恒等演算を実行し、負の入力に対して非線形となる指数演算を実行します。 | |
ガウス誤差線形単位 (GELU) 層は、ガウス確率分布に従って入力を重み付けします。 | |
Swish 活性化層は、層の入力に対して Swish 関数を適用します。 | |
双曲線正接 (tanh) 活性化層は、層の入力に対して tanh 関数を適用します。 | |
ソフトマックス層は、入力にソフトマックス関数を適用します。 | |
シグモイド層は、出力が区間 (0,1) の範囲に収まるように、シグモイド関数を入力に適用します。 | |
関数層は、指定された関数を層の入力に適用します。 |
層 | 説明 |
---|---|
バッチ正規化層は、観測値全体におけるデータ ミニバッチの正規化を、各チャネルについて個別に行います。畳み込みニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用します。 | |
グループ正規化層は、グループ化されたチャネル サブセット全体におけるデータのミニバッチの正規化を、各観測値について個別に行います。畳み込みニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、畳み込み層の間にあるグループ正規化層と、ReLU 層などの非線形性を使用します。 | |
レイヤー正規化層は、すべてのチャネル全体におけるデータのミニバッチの正規化を、各観測値について個別に行います。再帰型多層パーセプトロン ニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、LSTM 層や全結合層などの学習可能な層の後に、レイヤー正規化層を使用します。 | |
チャネル単位の局所応答 (クロスチャネル) 正規化層は、チャネル単位の正規化を行います。 |
層 | 説明 |
---|---|
ドロップアウト層は、与えられた確率でランダムに、入力要素をゼロに設定します。 | |
2 次元切り取り層は、入力に 2 次元のトリミングを適用します。 | |
| STFT 層は、入力の短時間フーリエ変換を計算します。 |
| CWT 層は、入力の CWT を計算します。 |
| MODWT 層は、入力の MODWT および MODWT 多重解像度解析 (MRA) を計算します。 |
層 | 説明 |
---|---|
1 次元平均プーリング層は、入力を 1 次元のプーリング領域に分割し、各領域の平均値を計算することによって、ダウンサンプリングを実行します。 | |
2 次元平均プーリング層は、入力を矩形のプーリング領域に分割し、各領域の平均を計算することによって、ダウンサンプリングを実行します。 | |
3 次元平均プーリング層は、3 次元入力を直方体のプーリング領域に分割し、各領域の平均値を計算することによって、ダウンサンプリングを実行します。 | |
1 次元グローバル平均プーリング層は、入力の時間次元または空間次元の平均を出力することによって、ダウンサンプリングを実行します。 | |
2 次元グローバル平均プーリング層は、入力の高さおよび幅の次元の平均を計算することによって、ダウンサンプリングを実行します。 | |
3 次元グローバル平均プーリング層は、入力の高さ、幅、および深さの次元の平均を計算することによって、ダウンサンプリングを実行します。 | |
1 次元最大プーリング層は、入力を 1 次元のプーリング領域に分割し、各領域の最大値を計算することによって、ダウンサンプリングを実行します。 | |
2 次元最大プーリング層は、入力を矩形のプーリング領域に分割し、各領域の最大値を計算することによって、ダウンサンプリングを実行します。 | |
3 次元最大プーリング層は、3 次元入力を直方体のプーリング領域に分割し、各領域の最大値を計算することによって、ダウンサンプリングを実行します。 | |
1 次元グローバル最大プーリング層は、入力の時間次元または空間次元の最大値を出力することによって、ダウンサンプリングを実行します。 | |
2 次元グローバル最大プーリング層は、入力の高さおよび幅の次元の最大値を計算することによって、ダウンサンプリングを実行します。 | |
3 次元グローバル最大プーリング層は、入力の高さ、幅、および深さの次元の最大値を計算することによって、ダウンサンプリングを実行します。 | |
2 次元最大逆プーリング層は、2 次元最大プーリング層の出力を逆プーリングします。 |
層 | 説明 |
---|---|
加算層は、複数のニューラル ネットワーク層からの入力を要素単位で加算します。 | |
乗算層は、複数のニューラル ネットワーク層からの入力を要素単位で乗算します。 | |
深さ連結層は、高さと幅が同じである入力を取り、3 番目の次元 (チャネルの次元) に沿ってこれらを連結します。 | |
連結層は入力を取り、指定された次元に沿って入力を連結します。入力のサイズは、連結の次元を除き、すべての次元で同じでなければなりません。 |
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
コード生成では、
InputNames
プロパティおよびOutputNames
プロパティのみがサポートされています。dlnetwork
オブジェクトのInitialized
プロパティは true に設定しなければなりません。ベクトル シーケンスまたはイメージ シーケンスの入力をもつ
dlnetwork
のコードを生成できます。ARM® Compute の場合、dlnetwork
は、シーケンス入力層および非シーケンス入力層をもつことができます。Intel® MKL-DNN の場合、入力層はすべてシーケンス入力層でなければなりません。コード生成は次をサポートします。データ形式が
'CT'
または'CBT'
であるベクトル シーケンスを含むdlarray
。データ形式が
'SSCT'
または'SSCBT'
であるイメージ シーケンスを含むdlarray
。異種混合の入力層をもつ多入力の
dlnetwork
。RNN ネットワークでは、複数の入力がサポートされていません。
コード生成では、オブジェクト関数
predict
のみがサポートされています。predict
メソッドへのdlarray
入力はsingle
データ型でなければなりません。コード生成では、MIMO
dlnetworks
がサポートされています。コード生成用の
dlnetwork
オブジェクトを作成するには、コード生成のための事前学習済みネットワークの読み込み (MATLAB Coder)を参照してください。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意および制限:
コード生成では、
InputNames
プロパティおよびOutputNames
プロパティのみがサポートされています。dlnetwork
オブジェクトのInitialized
プロパティは true に設定しなければなりません。ベクトル シーケンスおよびイメージ シーケンスの入力をもつ
dlnetwork
のコードを生成できます。コード生成は次をサポートします。データ形式が
'CT'
または'CBT'
であるベクトル シーケンスを含むdlarray
。データ形式が
'SSCT'
または'SSCBT'
であるイメージ シーケンスを含むdlarray
。異種混合の入力層をもつ多入力の
dlnetwork
。RNN ネットワークでは、複数の入力がサポートされていません。
コード生成では、オブジェクト関数
predict
のみがサポートされています。predict
メソッドへのdlarray
入力はsingle
データ型でなければなりません。コード生成では、cuDNN ターゲットおよび TensorRT ターゲットの
dlnetwork
がサポートされています。コード生成では、ARM Mali ターゲットのdlnetwork
はサポートされていません。精度が
INT8
である TensorRT をターゲットとする場合、ネットワークの最後の層はsoftmaxLayer
層でなければなりません。コード生成では、MIMO
dlnetworks
がサポートされています。コード生成用の
dlnetwork
オブジェクトを作成するには、コード生成用の事前学習済みのネットワークの読み込み (GPU Coder)を参照してください。
バージョン履歴
R2019b で導入R2021a: dlnetwork
の状態値は dlarray
オブジェクトである
dlnetwork
オブジェクトの State
は、ネットワークに含まれる各層の状態パラメーターの名前と値が格納された table です。
R2021a 以降、状態値は dlarray
オブジェクトになっています。この変更によって、AcceleratedFunction
オブジェクトを使用する際のサポートが強化されています。頻繁に変更される入力値 (ネットワークの状態を含む入力など) をもつ深層学習関数を高速化するには、頻繁に変更される値を dlarray
オブジェクトとして指定しなければなりません。
以前のバージョンでは、状態値が数値配列になっています。
多くの場合、コードを更新する必要はありません。状態値を数値配列にする必要があるコードの場合、以前の動作を再現するには、関数 extractdata
と関数 dlupdate
を併用して状態値からデータを手動で抽出します。
state = dlupdate(@extractdata,net.State);
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)