dlnetwork
説明
dlnetwork
オブジェクトを使用すると、自動微分を使用するカスタム学習ループをサポートできます。
ヒント
ほとんどの深層学習タスクでは、事前学習済みのニューラル ネットワークを使用して独自のデータに適応させることができます。転移学習を使用して、畳み込みニューラル ネットワークの再学習を行い、新しい一連のイメージを分類する方法を示す例については、新しいイメージを分類するための深層学習ネットワークの学習を参照してください。または、関数 trainnet
、関数 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
は層を直列に結合します。
ネットワーク層に出力層を含めてはなりません。ネットワークに学習させるときに、損失を別途計算します。
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 配列として指定します。
ネットワーク入力は、入力層および層の未接続入力です。
入力層および 1 つの入力をもつ層の場合、入力の名前は層の名前です。複数の入力をもつ層の場合、入力の名前は 'layerName/inputName'
です。ここで、layerName
は層の名前、inputName
は層の入力の名前です。
データ型: cell
OutputNames
— ネットワーク出力の名前
文字ベクトルの cell 配列
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 | 層グラフまたはネットワークへの層の追加 |
removeLayers | 層グラフまたはネットワークからの層の削除 |
connectLayers | 層グラフまたはネットワークの層の結合 |
disconnectLayers | 層グラフまたはネットワークの層の切り離し |
replaceLayer | 層グラフまたはネットワークの層の置き換え |
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 個のチャネルをもつ 32 行 32 列のサイズの入力を使用します。
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
を使用して数字データをイメージ データストアとして読み込み、イメージ データが格納されているフォルダーを指定します。
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.
モデル損失関数の定義
深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 と見なすことにより (ここで、 はネットワーク入力、 は学習可能なパラメーターのセット)、 を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 と対応するターゲット に対して、予測 と の間の誤差が最小になるように、学習可能なパラメーター を最適化します。
例のモデル損失関数の節にリストされている関数 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" ""], ... 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
は、次の手順を使用して予測子とラベルのミニバッチを前処理します。
関数
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
が自動的に初期化されます。詳細については、深層学習のネットワーク構成を参照してください。
拡張機能
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 ネットワークでは、複数入力をサポートしていません。可変サイズの時間 (T) 次元の
dlarray
入力。このようなdlarray
オブジェクトを使用して、可変シーケンス長の時系列データを表します。
コード生成は、オブジェクト関数
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 ネットワークでは、複数入力をサポートしていません。可変サイズの時間 (T) 次元の
dlarray
入力。このようなdlarray
オブジェクトを使用して、可変シーケンス長の時系列データを表します。
コード生成は、オブジェクト関数
predict
のみをサポートします。predict
メソッドへのdlarray
入力は、single
データ型でなければなりません。コード生成は、cuDNN、ARM Cortex-A、および TensorRT をターゲットとする
dlnetwork
をサポートします。コード生成は、ARM Mali ターゲットのdlnetwork
をサポートしていません。精度が
INT8
である TensorRT をターゲットとする場合、ネットワークの最後の層はsoftmaxLayer
層でなければなりません。コード生成は MIMO の
dlnetworks
をサポートします。コード生成用の
dlnetwork
オブジェクトを作成するには、コード生成用の事前学習済みのネットワークの読み込み (GPU Coder)を参照してください。
バージョン履歴
R2019b で導入R2023b: 未設定の正規化統計量をもつ入力層が含まれるネットワークの初期化
imageInputLayer
や sequenceInputLayer
などの入力層には、ネットワークがデータの正規化で使用するプロパティが含まれています。そのようなプロパティには、Mean
、StandardDeviation
、Min
、および Max
があります。ソフトウェアは、これらのプロパティを使用して、層の Normalization
プロパティによって定義されたデータ正規化方式を適用します。
R2023b 以降、初期化済みの dlnetwork
を作成するか関数 initialize
を使用してネットワークを初期化すると、入力層の Mean
、StandardDeviation
、Min
、および Max
の各プロパティは、層の作成時にそれらを設定しておらず、正規化方式でそれらが必要となる場合、ソフトウェアによって初期化されます。zscore
のように 2 つのプロパティを使用する正規化方式の場合、層の作成時にどちらのプロパティも設定していない場合にのみ、ソフトウェアはそれらのプロパティを初期化します。
zerocenter
正規化の場合、Mean
が0
に初期化される。zscore
正規化の場合、Mean
が0
に初期化され、StandardDeviation
が1
に初期化される。rescale-symmetric
正規化の場合、Min
が-1
に初期化され、Max
が1
に初期化される。rescale-zero-one
正規化の場合、Min
が0
に初期化され、Max
が1
に初期化される。
既定では、ソフトウェアは学習時に正規化統計量を自動的に計算します。正規化をカスタマイズするには、入力層のプロパティ Mean
、StandardDeviation
、Min
、および Max
を手動で設定します。
以前のリリースでは、正規化方式を使用する入力層が含まれるネットワークを初期化する場合、その正規化方式で必要なプロパティを層の作成時に指定していないと、ソフトウェアでエラーが発生します。
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)