Main Content

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

カスタム深層学習層の定義

ヒント

このトピックでは、問題に合わせてカスタム深層学習層を定義する方法を説明します。Deep Learning Toolbox™ に組み込まれている層の一覧については、深層学習層の一覧を参照してください。

このトピックでは、深層学習層のアーキテクチャと、問題に使用するカスタム層を定義する方法を説明します。

説明

カスタム深層学習層を定義し、オプションの学習可能なパラメーターを指定します。

学習可能なパラメーターを含むカスタム層の定義方法の例については、学習可能なパラメーターを含むカスタム深層学習層の定義を参照してください。複数の入力があるカスタム層の定義方法を示す例については、複数の入力があるカスタム深層学習層の定義を参照してください。

分類出力層

カスタム分類出力層を定義し、損失関数を指定します。

カスタム分類出力層を定義し、損失関数を指定する方法を示す例については、カスタム分類出力層の定義を参照してください。

回帰出力層

カスタム回帰出力層を定義し、損失関数を指定します。

カスタム回帰出力層を定義し、損失関数を指定する方法を示す例については、カスタム回帰出力層の定義を参照してください。

層テンプレート

以下のテンプレートを使用して、新しい層を定義できます。

 中間層テンプレート

 分類出力層テンプレート

 回帰出力層テンプレート

中間層のアーキテクチャ

学習時には、ネットワークのフォワード パスとバックワード パスが反復して実行されます。

ネットワークのフォワード パスを行う場合、各層は前の層の出力を取り、関数を適用し、結果を次の層に出力 (順伝播) します。

層は複数の入力または出力を持つことができます。たとえば、層は複数の前の層から X1, …, Xn を取り、出力 Z1, …, Zm を次の層に順伝播できます。

ネットワークのフォワード パスの最後に、出力層は予測 Y と真のターゲット T の間の損失 L を計算します。

ネットワークのバックワード パスでは、それぞれの層は、層の出力についての損失の微分を取り、入力についての損失 L の微分を計算し、その結果を逆伝播します。層に学習可能なパラメーターがある場合、層は層の重み (学習可能なパラメーター) の微分も計算します。層は、重みの微分を使用して学習可能なパラメーターを更新します。

次の図は、深層ニューラル ネットワークにおけるデータのフローを説明するもので、1 つの入力 X、1 つの出力 Z、および学習可能なパラメーター W がある層経由のデータ フローを強調しています。

中間層のプロパティ

層のプロパティはクラス定義の properties セクションで宣言します。

既定では、カスタム中間層に次のプロパティがあります。

Property説明
Name層の名前。文字ベクトルまたは string スカラーとして指定します。層グラフに層を含めるには、層に空ではない一意の名前を指定しなければなりません。この層が含まれる系列ネットワークに学習させて Name'' に設定すると、学習時に層に名前が自動的に割り当てられます。
Description

層についての 1 行の説明。文字ベクトルまたは string スカラーとして指定します。この説明は、層が Layer 配列に表示されるときに表示されます。層の説明を指定しない場合、層のクラス名が表示されます。

Type層のタイプ。文字ベクトルまたは string スカラーとして指定します。Type の値は、層が Layer 配列に表示されるときに表示されます。層のタイプを指定しない場合、層のクラス名が表示されます。
NumInputs層の入力の数。正の整数として指定します。この値を指定しない場合、NumInputsInputNames の名前の数に自動的に設定されます。既定値は 1 です。
InputNames層の入力の名前。文字ベクトルの cell 配列として指定します。この値を指定せず、NumInputs が 1 より大きい場合、InputNames{'in1',...,'inN'} に自動的に設定されます。ここで、N = NumInputs です。既定値は {'in'} です。
NumOutputs層の出力の数。正の整数として指定します。この値を指定しない場合、NumOutputsOutputNames の名前の数に自動的に設定されます。既定値は 1 です。
OutputNames層の出力の名前。文字ベクトルの cell 配列として指定します。この値を指定せず、NumOutputs が 1 より大きい場合、OutputNames{'out1',...,'outM'} に自動的に設定されます。ここで、M = NumOutputs です。既定値は {'out'} です。

層にその他のプロパティがない場合は、properties セクションを省略できます。

ヒント

複数の入力がある層を作成する場合、層のコンストラクターで NumInputsInputNames のいずれかのプロパティを設定しなければなりません。複数の出力がある層を作成している場合、層のコンストラクターで NumOutputsOutputNames のいずれかのプロパティを設定しなければなりません。例については、複数の入力があるカスタム深層学習層の定義を参照してください。

学習可能なパラメーター

層の学習可能なパラメーターはクラス定義の properties (Learnable) セクションで宣言します。学習可能なパラメーターとして、数値配列または dlnetwork オブジェクトを指定できます。層に学習可能なパラメーターがない場合は、properties (Learnable) セクションを省略できます。

オプションで、学習可能なパラメーターの学習率係数および L2 係数を指定できます。既定では、それぞれの学習可能なパラメーターの学習率係数と L2 係数は 1 に設定されています。

組み込みの層とカスタム層のどちらの場合も、以下の関数を使用して、学習率係数と L2 正則化係数を設定および取得できます。

関数説明
setLearnRateFactor学習可能なパラメーターの学習率係数を設定します。
setL2Factor学習可能なパラメーターの L2 正則化係数を設定します。
getLearnRateFactor学習可能なパラメーターの学習率係数を取得します。
getL2Factor学習可能なパラメーターの L2 正則化係数を取得します。

学習可能なパラメーターの学習率係数および L2 係数を指定するには、構文 layer = setLearnRateFactor(layer,'MyParameterName',value) および layer = setL2Factor(layer,parameterName,value) をそれぞれ使用します。

学習可能なパラメーターの学習率係数および L2 係数の値を取得するには、構文 getLearnRateFactor(layer,'MyParameterName') および getL2Factor(layer,parameterName) をそれぞれ使用します。

たとえば、この構文は、'Alpha' という名前の学習可能なパラメーターの学習率係数を 0.1 に設定します。

layer = setLearnRateFactor(layer,'Alpha',0.1);

順方向関数

層によっては学習時と予測時の動作が異なる場合があります。たとえば、ドロップアウト層は学習時にのみドロップアウトを行い、予測時には何の影響も与えません。層は、フォワード パスを実行するために 2 つの関数 predictforward のいずれかを使用します。フォワード パスが予測時に発生する場合、層は関数 predict を使用します。フォワード パスが学習時に発生する場合、層は関数 forward を使用します。予測時と学習時で異なる 2 つの関数を必要としない場合は、関数 forward を省略できます。この場合、学習時に層は predict を使用します。

関数 forward およびカスタム逆方向関数を定義する場合、逆伝播時に使用できる引数 memory に値を割り当てなければなりません。

predict の構文は [Z1,…,Zm] = predict(layer,X1,…,Xn) です。ここで、X1,…,Xnn 個の層入力、Z1,…,Zmm 個の層出力です。値 n および m は、層の NumInputs プロパティおよび NumOutputs プロパティに対応しなければなりません。

ヒント

predict への入力の数が変化する可能性がある場合、X1,…,Xn ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、varargin{i}Xi に対応します。出力の数が変化する可能性がある場合、Z1,…,Zm ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、varargout{j}Zj に対応します。

ヒント

学習可能なパラメーターの dlnetwork オブジェクトがカスタム層にある場合、カスタム層の関数 predict 内で、dlnetwork の関数 predict を使用します。dlnetwork オブジェクトの関数 predict を使用すると、ソフトウェアは必ず適切な層処理を選択して予測を行います。

forward の構文は [Z1,…,Zm,memory] = forward(layer,X1,…,Xn) です。ここで、X1,…,Xnn 個の層入力、Z1,…,Zmm 個の層出力、memory は層のメモリです。

ヒント

forward への入力の数が変化する可能性がある場合、X1,…,Xn ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、varargin{i}Xi に対応します。出力の数が変化する可能性がある場合、Z1,…,Zm ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、j = 1,…,NumOutputs について varargout{j}Zj に対応し、varargout{NumOutputs + 1}memory に対応します。

ヒント

学習可能なパラメーターの dlnetwork オブジェクトがカスタム層にある場合、カスタム層の関数 forward 内で、dlnetwork オブジェクトの関数 forward を使用します。dlnetwork オブジェクトの関数 forward を使用すると、ソフトウェアは必ず適切な層処理を選択して学習を行います。

入力の次元は、データのタイプと結合層の出力によって異なります。

層入力入力サイズ観察値の次元
2 次元イメージh x w x c x N。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。N は観測値の数です。4
3 次元イメージh x w x d x c x N。ここで、h、w、d、および c は、それぞれ 3 次元イメージの高さ、幅、深さ、およびチャネル数に対応します。N は観測値の数です。5
ベクトル シーケンスc x N x S。ここで、c はシーケンスの特徴の数、N は観測値の数、S はシーケンス長です。2
2 次元イメージ シーケンスh x w x c x N x S。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。N は観測値の数、S はシーケンス長です。4
3 次元イメージ シーケンスh x w x d x c x N x S。ここで、h、w、d、および c は、それぞれ 3 次元イメージの高さ、幅、深さ、およびチャネル数に対応します。N は観測値の数、S はシーケンス長です。5

シーケンスを出力する層の場合、その層は、任意の長さのシーケンス、または時間次元をもたないデータを出力できます。関数 trainNetwork を使用して、シーケンスを出力するネットワークに学習させる場合は、入力シーケンスと出力シーケンスの長さが一致していなければならない点に注意してください。

逆方向関数

層の逆方向関数は、入力データについての損失の微分を計算し、結果を前の層に出力 (逆伝播) します。層に学習可能なパラメーター (層の重みなど) がある場合、backward は学習可能なパラメーターの微分も計算します。関数 trainNetwork を使用する場合、バックワード パスの間に、層は、これらの微分を使用して学習可能なパラメーターを自動的に更新します。

逆方向関数の定義はオプションです。逆方向関数を指定せず、層の順方向関数が dlarray オブジェクトをサポートしている場合、自動微分を使用して逆方向関数が自動的に決定されます。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。次のことを行う場合、カスタム逆方向関数を定義します。

  • 特定のアルゴリズムを使用して微分を計算する。

  • dlarray オブジェクトをサポートしない順方向関数で演算を使用する。

学習可能な dlnetwork オブジェクトをもつカスタム層では、カスタム逆方向関数がサポートされていません。

カスタム逆方向関数を定義するには、backward という名前の関数を作成します。

backward の構文は [dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory) です。ここで、次のようになります。

  • X1,…,Xnn 個の層入力

  • Z1,…,Zm は層の順方向関数の m 個の出力

  • dLdZ1,…,dLdZm は次の層から逆伝播された勾配

  • forward が定義された場合、memoryforward のメモリ出力。そうでない場合、memory[]

出力において、dLdX1,…,dLdXn は層入力についての損失の微分で、dLdW1,…,dLdWkk 個の学習可能なパラメーターについての損失の微分です。フォワード パスとバックワード パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~ に置き換えます。

ヒント

backward への入力の数が変化する可能性がある場合、layer の後に入力引数ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、i=1,…,NumInputs について varargin{i}Xi に対応し、j=1,…,NumOutputs について varargin{NumInputs+j} および varargin{NumInputs+NumOutputs+j} はそれぞれ Zj および dLdZj に対応し、varargin{end}memory に対応します。

出力の数が変化する可能性がある場合、出力引数ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、i=1,…,NumInputs について varargout{i}dLdXit=1,…,k について varargout{NumInputs+t}dLdWt に対応します。k は学習可能なパラメーターの数です。

X1,…,XnZ1,…,Zm の値は順方向関数の場合と同じです。dLdZ1,…,dLdZm の次元は、それぞれ Z1,…,Zm の次元と同じです。

dLdX1,…,dLdxn の次元およびデータ型は、それぞれ X1,…,Xn の次元およびデータ型と同じです。dLdW1,…,dLdWk の次元およびデータ型は、それぞれ W1,…,Wk の次元およびデータ型と同じです。

損失の微分の計算には次の連鎖律が使用できます。

LX(i)=jLZjZjX(i)

LWi=jLZjZjWi

関数 trainNetwork を使用する場合、バックワード パスの間に、層は、微分 dLdW1,…,dLdWk を使用して学習可能なパラメーターを自動的に更新します。

カスタム逆方向関数の定義方法を示す例については、カスタム層の逆方向関数の指定を参照してください。

GPU 互換性

層の順方向関数が dlarray オブジェクトを完全にサポートしている場合、層は GPU 互換です。そうでない場合、GPU 互換にするには、層関数が入力をサポートし、gpuArray (Parallel Computing Toolbox) 型の出力を返さなければなりません。

多くの MATLAB® 組み込み関数が入力引数 gpuArray (Parallel Computing Toolbox) および dlarray をサポートしています。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、サポートされている GPU デバイスもなければなりません。サポートされているデバイスについては、リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。MATLAB での GPU の使用の詳細は、MATLAB での GPU 計算 (Parallel Computing Toolbox)を参照してください。

コード生成の互換性

コード生成をサポートするカスタム層を作成するには、次のことが必要です。

  • 層は層の定義でプラグマ %#codegen を指定しなければなりません。

  • predict の入力は次のようになっていなければなりません。

    • 次元が一致している。各入力の次元の数が同じでなければなりません。

    • バッチ サイズが一致している。各入力のバッチ サイズが同じでなければなりません。

  • predict の出力の次元とバッチ サイズが層の入力と一致していなければなりません。

  • 非スカラーのプロパティは、single 配列、double 配列、または文字配列でなければなりません。

  • スカラーのプロパティは、数値型、logical 型、または string 型でなければなりません。

コード生成では、2 次元イメージ入力のみで中間層がサポートされます。

コード生成をサポートするカスタム層を作成する方法を示す例については、コード生成用のカスタム深層学習層の定義を参照してください。

ネットワーク構成

それ自体が層グラフを定義するカスタム層を作成するには、学習可能なパラメーターとして dlnetwork オブジェクトを指定できます。この手法は "ネットワーク構成" と呼ばれます。以下の場合にネットワーク構成を使用できます。

  • 学習可能な層のブロックを表す単一のカスタム層 (残差ブロックなど) の作成。

  • コントロール フローをもつネットワーク (入力データに応じて動的に変更できるセクションをもつネットワークなど) の作成。

  • ループをもつネットワーク (自分自身に出力をフィードバックするセクションをもつネットワークなど) の作成。

層の有効性のチェック

カスタム深層学習層を作成する場合、関数 checkLayer を使用して、層が有効であることをチェックできます。この関数は、層について、有効性、GPU 互換性、勾配定義の正しさ、コード生成の互換性をチェックします。層が有効であることをチェックするには、次のコマンドを実行します。

checkLayer(layer,validInputSize,'ObservationDimension',dim)
ここで、layer は層のインスタンス、validInputSize は層に有効な入力サイズを指定するベクトルまたは cell 配列であり、dim は層の入力データにおける観測値の次元を指定します。入力サイズが大きい場合、勾配チェックの実行に時間がかかります。テストを高速化するには、指定する有効な入力サイズを小さくします。

詳細については、カスタム層の有効性のチェックを参照してください。

checkLayer を使用した層の有効性のチェック

カスタム層 preluLayer について層の有効性をチェックします。

カスタム PReLU 層を定義します。この層を作成するには、ファイル preluLayer.m を現在のフォルダーに保存します。

層のインスタンスを作成し、checkLayer を使用してその有効性をチェックします。層への典型的な入力における 1 つの観測値のサイズになるように有効な入力サイズを指定します。層には 4 次元配列を入力する必要があり、最初の 3 つの次元は前の層の出力における高さ、幅、およびチャネル数に対応し、4 番目の次元は観測値に対応します。

観測値の入力の典型的なサイズを指定し、'ObservationDimension' を 4 に設定します。

layer = preluLayer(20,'prelu');
validInputSize = [24 24 20];
checkLayer(layer,validInputSize,'ObservationDimension',4)
Skipping GPU tests. No compatible GPU device found.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the 'CheckCodegenCompatibility' and 'ObservationDimension' options.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... ...
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 13 Passed, 0 Failed, 0 Incomplete, 9 Skipped.
	 Time elapsed: 0.15555 seconds.

ここでは、関数で層に関する問題はまったく検出されていません。

ネットワークに層を含める

Deep Learning Toolbox では、カスタム層を他の層と同じように使用できます。

カスタム PReLU 層を定義します。この層を作成するには、ファイル preluLayer.m を現在のフォルダーに保存します。

カスタム層 preluLayer を含む層配列を作成します。

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    preluLayer(20,'prelu')
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

出力層のアーキテクチャ

学習時のフォワード パスの最後で、出力層は前の層の予測 (出力) y を取り、これらの予測と学習ターゲットの間の損失 L を計算します。出力層は、予測 y について損失 L の微分を計算し、結果を前の層に出力 (逆伝播) します。

次の図は、畳み込みニューラル ネットワークおよび出力層におけるデータのフローを示しています。

出力層のプロパティ

層のプロパティはクラス定義の properties セクションで宣言します。

既定では、カスタム出力層には次のプロパティがあります。

  • Name層の名前。文字ベクトルまたは string スカラーとして指定します。層グラフに層を含めるには、層に空ではない一意の名前を指定しなければなりません。この層が含まれる系列ネットワークに学習させて Name'' に設定すると、学習時に層に名前が自動的に割り当てられます。

  • Description – 層についての 1 行の説明。文字ベクトルまたは string スカラーとして指定します。この説明は、層が Layer 配列に表示されるときに表示されます。層の説明を指定しない場合、"Classification Output" または "Regression Output" が表示されます。

  • Type – 層のタイプ。文字ベクトルまたは string スカラーとして指定します。Type の値は、層が Layer 配列に表示されるときに表示されます。層のタイプを指定しない場合、層のクラス名が表示されます。

カスタム分類層には次のプロパティもあります。

  • Classes出力層のクラス。categorical ベクトル、string 配列、文字ベクトルの cell 配列、または 'auto' として指定します。Classes'auto' の場合、学習時にクラスが自動的に設定されます。string 配列または文字ベクトルの cell 配列 str を指定すると、出力層のクラスが categorical(str,str) に設定されます。

カスタム回帰層には次のプロパティもあります。

  • ResponseNames応答の名前。文字ベクトルの cell 配列または string 配列として指定します。学習時に、学習データに従って応答名が自動的に設定されます。既定値は {} です。

層にその他のプロパティがない場合は、properties セクションを省略できます。

損失関数

出力層は、順方向損失関数を使用して予測とターゲットの間の損失 L を計算し、逆方向損失関数を使用して予測についての損失の微分を計算します。

forwardLoss の構文は、loss = forwardLoss(layer, Y, T) です。入力 Y は、ネットワークで行った予測に対応します。これらの予測は前の層の出力です。入力 T は学習ターゲットに対応します。出力 loss は、指定された損失関数に従った YT の間の損失です。出力 loss はスカラーでなければなりません。

層の順方向損失関数が dlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されます。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。または、カスタム逆方向損失関数を定義するには、backwardLoss という名前の関数を作成します。カスタム逆方向損失関数の定義方法を示す例については、カスタム出力層の逆方向損失関数の指定を参照してください。

backwardLoss の構文は、dLdY = backwardLoss(layer, Y, T) です。入力 Y はネットワークで行った予測を含み、T は学習ターゲットを含みます。出力 dLdY は予測 Y についての損失の微分です。出力 dLdY は、層入力 Y と同じサイズでなければなりません。

分類問題の場合、T の次元は問題のタイプによって異なります。

分類タスク入力サイズ観察値の次元
2 次元イメージ分類1 x 1 x K x N。ここで、K はクラスの数、N は観測値の数です。4
3 次元イメージ分類1 x 1 x 1 x K x N。ここで、K はクラスの数、N は観測値の数です。5
sequence-to-label 分類K 行 N 列。K はクラスの数、N は観測値の数です。2
sequence-to-sequence 分類K x N x S。ここで、K はクラス数、N は観測値の数、S はシーケンス長です。2

Y のサイズは前の層の出力によって異なります。YT と同じサイズになるように、正しいサイズを出力する層を出力層の前に含めなければなりません。たとえば、Y を必ず K 個のクラスの予測スコアを持つ 4 次元配列にするために、サイズが K の全結合層を含め、その後にソフトマックス層、出力層の順に配置することができます。

回帰問題の場合、T の次元も問題のタイプによって異なります。

回帰タスク入力サイズ観察値の次元
2 次元イメージ回帰1 x 1 x R x N。ここで、R は応答の数、N は観測値の数です。4
2 次元 image-to-image 回帰h x w x c x N。ここで、h、w、および c は、それぞれ出力の高さ、幅、およびチャネル数、N は観測値の数です。4
3 次元イメージ回帰1 x 1 x 1 x R x N。ここで、R は応答の数、N は観測値の数です。5
3 次元 image-to-image 回帰h x w x d x c x N。ここで、h、w、d、および c は、それぞれ出力の高さ、幅、深さ、およびチャネル数、N は観測値の数です。5
sequence-to-one 回帰R 行 N 列。ここで、R は応答の数、N は観測値の数です。2
sequence-to-sequence 回帰R x N x S。ここで、R は応答の数、N は観測値の数、S はシーケンス長です。2

たとえば、ネットワークで応答が 1 つのイメージ回帰ネットワークを定義していてミニバッチのサイズが 50 の場合、T はサイズ 1 x 1 x 1 x 50 の 4 次元配列です。

Y のサイズは前の層の出力によって異なります。YT と同じサイズになるように、正しいサイズを出力する層を出力層の前に含めなければなりません。たとえば、R 個の応答があるイメージ回帰の場合、Y を必ず正しいサイズの 4 次元配列にするために、出力層の前にサイズが R の全結合層を含めることができます。

関数 forwardLoss および backwardLoss には次の出力引数があります。

関数出力引数説明
forwardLossloss予測 Y と真のターゲット T の間で計算された損失
backwardLossdLdY予測 Y についての損失の微分

backwardLoss は前の層で必要なサイズの dLdY を出力し、dLdYY と同じサイズでなければなりません。

GPU 互換性

層の順方向関数が dlarray オブジェクトを完全にサポートしている場合、層は GPU 互換です。そうでない場合、GPU 互換にするには、層関数が入力をサポートし、gpuArray (Parallel Computing Toolbox) 型の出力を返さなければなりません。

多くの MATLAB 組み込み関数が入力引数 gpuArray (Parallel Computing Toolbox) および dlarray をサポートしています。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、サポートされている GPU デバイスもなければなりません。サポートされているデバイスについては、リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。MATLAB での GPU の使用の詳細は、MATLAB での GPU 計算 (Parallel Computing Toolbox)を参照してください。

ネットワークにカスタム回帰出力層を含める

Deep Learning Toolbox では、カスタム出力層を他の出力層と同じように使用できます。この節では、カスタム出力層を使用した回帰用ネットワークを作成し、学習させる方法を説明します。

この例では、畳み込みニューラル ネットワーク アーキテクチャを構築し、ネットワークの学習を行い、学習済みネットワークを使用して手書きの数字の回転角度を予測します。このような予測は、光学式文字認識に役立ちます。

カスタム平均絶対誤差回帰層を定義します。この層を作成するには、ファイル maeRegressionLayer.m を現在のフォルダーに保存します。

例の学習データを読み込みます。

[XTrain,~,YTrain] = digitTrain4DArrayData;

層配列を作成し、カスタム回帰出力層 maeRegressionLayer を含めます。

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(1)
    maeRegressionLayer('mae')]
layers = 
  6x1 Layer array with layers:

     1   ''      Image Input           28x28x1 images with 'zerocenter' normalization
     2   ''      Convolution           20 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''      Batch Normalization   Batch normalization
     4   ''      ReLU                  ReLU
     5   ''      Fully Connected       1 fully connected layer
     6   'mae'   Regression Output     Mean absolute error

学習オプションを設定し、ネットワークに学習させます。

options = trainingOptions('sgdm','Verbose',false);
net = trainNetwork(XTrain,YTrain,layers,options);

回転角度の予測値と実際の値との間の予測誤差を計算することによって、ネットワーク性能を評価します。

[XTest,~,YTest] = digitTest4DArrayData;
YPred = predict(net,XTest);
predictionError = YTest - YPred;

真の角度から許容誤差限界内にある予測の数を計算します。しきい値を 10 度に設定し、このしきい値の範囲内にある予測の比率を計算します。

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numTestImages = size(XTest,4);
accuracy = numCorrect/numTestImages
accuracy = 0.7524

参考

| | | | |

関連するトピック