学習可能なパラメーターを含むカスタム深層学習層の定義
目的のタスクに必要な層が Deep Learning Toolbox™ に用意されていない場合、この例を指針として使用して独自のカスタム層を定義できます。組み込み層の一覧については、深層学習層の一覧を参照してください。
カスタム深層学習層を定義するために、この例で提供するテンプレートを使用できます。これは、以下の手順を実行します。
層の命名 — MATLAB® で使用できるように層に名前を付けます。
層のプロパティの宣言 — 層のプロパティ (学習可能なパラメーターや状態パラメーターなど) を指定します。
コンストラクター関数の作成 (オプション) — 層の構築とそのプロパティ初期化の方法を指定します。コンストラクター関数を指定しない場合、作成時に
Name
、Description
、およびType
の各プロパティは[]
で初期化され、層の入力および出力の数は1
に設定されます。初期化関数の作成 (オプション) — ネットワークの初期化時に学習可能なパラメーターと状態パラメーターを初期化する方法を指定します。初期化関数を指定しない場合、ネットワークの初期化時にパラメーターは初期化されません。
順方向関数の作成 — 予測時および学習時に層経由でデータを順方向にパス (順伝播) する方法を指定します。
リセット ステート関数の作成 (オプション) — 状態パラメーターをリセットする方法を指定します。
逆方向関数の作成 (オプション) — 入力データおよび学習可能なパラメーターにおける損失の微分を指定します (逆伝播)。逆方向関数を指定しない場合、順方向関数は
dlarray
オブジェクトをサポートしなければなりません。
層の関数を定義するときに、dlarray
オブジェクトを使用できます。dlarray
オブジェクトを使用すると、次元にラベルを付けることができるため、高次元のデータをより簡単に扱うことができます。たとえば、"S"
、"T"
、"C"
、"B"
のラベルを使用して、各次元が空間、時間、チャネル、バッチのどの次元に対応するかを示すことができます。特に指定がないその他の次元については、ラベル "U"
を使用します。特定の次元に対して演算を行うオブジェクト関数 dlarray
の場合、dlarray
オブジェクトの形式を直接整えるか、DataFormat
オプションを使用することで、次元ラベルを指定できます。
形式を整えた dlarray
オブジェクトをカスタム層で使用することで、次元の並べ替え、追加、削除を行う層など、入力と出力の形式が異なる層を定義することもできます。たとえば、形式が "SSCB"
(spatial、spatial、channel、batch) であるイメージのミニバッチを入力として受け取り、形式が "CBT"
(channel、batch、time) であるシーケンスのミニバッチを出力する層を定義できます。形式を整えた dlarray
オブジェクトを使用すると、入力形式が異なるデータの処理が可能な層を定義することもできます。たとえば、形式 "SSCB"
(spatial、spatial、channel、batch) と "CBT"
(channel、batch、time) の入力をサポートする層を定義できます。
dlarray
オブジェクトは、自動微分のサポートを有効にすることもできます。この場合、順方向関数が dlarray
オブジェクトを完全にサポートしている場合、逆方向関数の定義はオプションです。
形式を整えた dlarray
オブジェクトをカスタム層順方向関数で使用するためのサポートを有効にするには、カスタム層を定義するときに nnet.layer.Formattable
クラスからも継承します。例については、形式を整えた入力をもつカスタム深層学習層の定義を参照してください。
この例では、4 つの学習可能なパラメーターをもつ層である SReLU 層を作成し、ニューラル ネットワークで使用する方法を示します。SReLU 層は、しきい値処理演算を実行します。ここで、層は各チャネルについて、区間外の値をスケーリングします。区間しきい値とスケーリング係数は学習可能なパラメーターです。[1]。
SReLU 演算は次で与えられます。
ここで、xi はチャネル i の入力、tli と tri はそれぞれチャネル i の左と右のしきい値、ali と ari はそれぞれチャネル i の左と右のスケーリング係数です。これらのしきい値とスケーリング係数は学習可能なパラメーターとなり、学習時にその層によって学習されます。
カスタム層テンプレート
カスタム層テンプレートを MATLAB の新しいファイルにコピーします。このテンプレートは、層のクラス定義の構造を提供します。概要は次のとおりです。
層のプロパティ、学習可能なパラメーター、状態パラメーターに関する、オプションの
properties
ブロック。層のコンストラクター関数。
オプションの関数
initialize
。関数
predict
とオプションの関数forward
。状態プロパティをもつ層におけるオプションの関数
resetState
。オプションの関数
backward
。
classdef myLayer < nnet.layer.Layer % ... % & nnet.layer.Formattable ... % (Optional) % & nnet.layer.Acceleratable % (Optional) properties % (Optional) Layer properties. % Declare layer properties here. end properties (Learnable) % (Optional) Layer learnable parameters. % Declare learnable parameters here. end properties (State) % (Optional) Layer state parameters. % Declare state parameters here. end properties (Learnable, State) % (Optional) Nested dlnetwork objects with both learnable % parameters and state parameters. % Declare nested networks with learnable and state parameters here. end methods function layer = myLayer() % (Optional) Create a myLayer. % This function must have the same name as the class. % Define layer constructor function here. end function layer = initialize(layer,layout) % (Optional) Initialize layer learnable and state parameters. % % Inputs: % layer - Layer to initialize % layout - Data layout, specified as a networkDataLayout % object % % Outputs: % layer - Initialized layer % % - For layers with multiple inputs, replace layout with % layout1,...,layoutN, where N is the number of inputs. % Define layer initialization function here. end function [Y,state] = predict(layer,X) % Forward input data through the layer at prediction time and % output the result and updated state. % % Inputs: % layer - Layer to forward propagate through % X - Input data % Outputs: % Y - Output of layer forward function % state - (Optional) Updated layer state % % - For layers with multiple inputs, replace X with X1,...,XN, % where N is the number of inputs. % - For layers with multiple outputs, replace Y with % Y1,...,YM, where M is the number of outputs. % - For layers with multiple state parameters, replace state % with state1,...,stateK, where K is the number of state % parameters. % Define layer predict function here. end function [Y,state,memory] = forward(layer,X) % (Optional) Forward input data through the layer at training % time and output the result, the updated state, and a memory % value. % % Inputs: % layer - Layer to forward propagate through % X - Layer input data % Outputs: % Y - Output of layer forward function % state - (Optional) Updated layer state % memory - (Optional) Memory value for custom backward % function % % - For layers with multiple inputs, replace X with X1,...,XN, % where N is the number of inputs. % - For layers with multiple outputs, replace Y with % Y1,...,YM, where M is the number of outputs. % - For layers with multiple state parameters, replace state % with state1,...,stateK, where K is the number of state % parameters. % Define layer forward function here. end function layer = resetState(layer) % (Optional) Reset layer state. % Define reset state function here. end function [dLdX,dLdW,dLdSin] = backward(layer,X,Y,dLdY,dLdSout,memory) % (Optional) Backward propagate the derivative of the loss % function through the layer. % % Inputs: % layer - Layer to backward propagate through % X - Layer input data % Y - Layer output data % dLdY - Derivative of loss with respect to layer % output % dLdSout - (Optional) Derivative of loss with respect % to state output % memory - Memory value from forward function % Outputs: % dLdX - Derivative of loss with respect to layer input % dLdW - (Optional) Derivative of loss with respect to % learnable parameter % dLdSin - (Optional) Derivative of loss with respect to % state input % % - For layers with state parameters, the backward syntax must % include both dLdSout and dLdSin, or neither. % - For layers with multiple inputs, replace X and dLdX with % X1,...,XN and dLdX1,...,dLdXN, respectively, where N is % the number of inputs. % - For layers with multiple outputs, replace Y and dLdY with % Y1,...,YM and dLdY,...,dLdYM, respectively, where M is the % number of outputs. % - For layers with multiple learnable parameters, replace % dLdW with dLdW1,...,dLdWP, where P is the number of % learnable parameters. % - For layers with multiple state parameters, replace dLdSin % and dLdSout with dLdSin1,...,dLdSinK and % dLdSout1,...,dldSoutK, respectively, where K is the number % of state parameters. % Define layer backward function here. end end end
層の命名とスーパークラスの指定
まず、層に名前を付けます。クラス ファイルの最初の行で、既存の名前 myLayer
を sreluLayer
に置き換えます。
classdef sreluLayer < nnet.layer.Layer % ... % & nnet.layer.Formattable ... % (Optional) % & nnet.layer.Acceleratable % (Optional) ... end
逆方向関数を指定しない場合、既定では、"形式を整えていない" dlarray
オブジェクトを層関数は入力として受け取ります。層が、"形式を整えた" dlarray
オブジェクトを入力として受け取り、さらに形式を整えた dlarray
オブジェクトを出力するように指定するには、カスタム層の定義時に nnet.layer.Formattable
クラスから継承します。
この層の関数は高速化をサポートするため、nnet.layer.Acceleratable
からも継承します。カスタム層の関数の高速化に関する詳細については、Custom Layer Function Accelerationを参照してください。この層は形式を整えられる入力を必要としないため、オプションの nnet.layer.Formattable
スーパークラスを削除します。
classdef sreluLayer < nnet.layer.Layer ... & nnet.layer.Acceleratable ... end
次に、コンストラクター関数 myLayer
(methods
セクションの最初の関数) の名前を層と同じ名前に変更します。
methods function layer = sreluLayer() ... end ... end
層の保存
層のクラス ファイルを sreluLayer.m
という名前の新しいファイルに保存します。このファイル名は層の名前に一致しなければなりません。この層を使用するには、このファイルを現在のフォルダーまたは MATLAB パス上のフォルダーに保存しなければなりません。
プロパティおよび学習可能なパラメーターの宣言
層のプロパティを properties
セクションで宣言し、学習可能なパラメーターを properties (Learnable)
セクションにリストすることによって宣言します。
既定では、カスタム層には次のプロパティがあります。これらのプロパティを properties
セクションで宣言しないでください。
Property | 説明 |
---|---|
Name | 層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainnet および関数 dlnetwork は、名前が "" の層に自動的に名前を割り当てます。 |
Description | 層についての 1 行の説明。string スカラーまたは文字ベクトルとして指定します。この説明は、層が 層の説明を指定しない場合、層のクラス名が表示されます。 |
Type | 層のタイプ。文字ベクトルまたは string スカラーとして指定します。 層のタイプを指定しない場合、層のクラス名が表示されます。 |
NumInputs | 層の入力の数。正の整数として指定します。この値を指定しない場合、NumInputs は InputNames の名前の数に自動的に設定されます。既定値は 1 です。 |
InputNames | 層の入力の名前。文字ベクトルの cell 配列として指定します。この値を指定せず、NumInputs が 1 より大きい場合、InputNames は {'in1',...,'inN'} に自動的に設定されます。ここで、N = NumInputs です。既定値は {'in'} です。 |
NumOutputs | 層の出力の数。正の整数として指定します。この値を指定しない場合、NumOutputs は OutputNames の名前の数に自動的に設定されます。既定値は 1 です。 |
OutputNames | 層の出力の名前。文字ベクトルの cell 配列として指定します。この値を指定せず、NumOutputs が 1 より大きい場合、OutputNames は {'out1',...,'outM'} に自動的に設定されます。ここで、M = NumOutputs です。既定値は {'out'} です。 |
層にその他のプロパティがない場合は、properties
セクションを省略できます。
ヒント
複数の入力がある層を作成する場合、層のコンストラクターで NumInputs
と InputNames
のいずれかのプロパティを設定しなければなりません。複数の出力がある層を作成している場合、層のコンストラクターで NumOutputs
と OutputNames
のいずれかのプロパティを設定しなければなりません。例については、複数の入力があるカスタム深層学習層の定義を参照してください。
SReLU 層には追加のプロパティが必要ないため、properties
セクションは削除できます。
SReLU 層には、左右それぞれのしきい値とスケーリング係数という 4 つの学習可能なパラメーターがあります。この学習可能なパラメーターを properties (Learnable)
セクションで宣言し、パラメーター Alpha
を呼び出します。
properties (Learnable)
% Layer learnable parameters
LeftSlope
RightSlope
LeftThreshold
RightThreshold
end
コンストラクター関数の作成
層を構築する関数を作成し、層のプロパティを初期化します。層を作成するために必要な変数をコンストラクター関数への入力として指定します。
SReLU 層のコンストラクター関数には、1 つのオプションの引数 (層の名前) が必要です。オプションの名前と値の引数に対応する args
という名前の入力引数を関数 sreluLayer
で指定します。関数の構文を説明するコメントを関数の上部に追加します。
function layer = sreluLayer(args) % layer = sreluLayercreates a SReLU layer. % % layer = sreluLayer(Name=name) also specifies the % layer name ... end
層のプロパティの初期化
コンストラクター関数で、層のプロパティを初期化します。コメント % Layer constructor function goes here
を、層のプロパティを初期化するコードに置き換えます。学習可能なパラメーターまたは状態パラメーターは、コンストラクター関数で初期化せず、関数 initialize
で初期化します。
arguments
ブロックを使用して入力引数を解析し、Name
プロパティを設定します。
arguments args.Name = ""; end % Set layer name. layer.Name = args.Name;
層の Description
プロパティを設定して、層に 1 行の説明を指定します。層のタイプの説明を設定します。
% Set layer description. layer.Description = "SReLU";
完成したコンストラクター関数を表示します。
function layer = sreluLayer(args)
% layer = sreluLayer creates a SReLU layer.
%
% layer = sreluLayer(Name=name) also specifies the
% layer name.
arguments
args.Name = "";
end
% Set layer name.
layer.Name = args.Name;
% Set layer description.
layer.Description = "SReLU";
end
このコンストラクター関数を使用すると、コマンド sreluLayer(Name="srelu")
によって "srelu"
という名前の SReLU 層が作成されます。
初期化関数の作成
ネットワークの初期化時に層の学習可能なパラメーターと状態パラメーターを初期化する関数を作成します。この関数では、プロパティが空の場合、学習可能なパラメーターと状態パラメーターのみを初期化するようにしてください。それ以外の場合に初期化すると、MAT ファイルからネットワークを読み込んだときに、ソフトウェアによって上書きされる可能性があります。
学習可能なパラメーターを初期化するには、入力データのチャネル数と同じ数のチャネルをもつランダム ベクトルを生成します。
ネットワークが使用できるようになるまで入力データのサイズは不明であるため、networkDataLayout
オブジェクトを使用して学習可能なパラメーターと状態パラメーターを初期化する初期化関数を作成しなければなりません (このオブジェクトは関数に渡されます)。ネットワークのデータ レイアウト オブジェクトには、想定される入力データのサイズと形式に関する情報が格納されます。サイズと形式の情報を使用して学習可能なパラメーターと状態パラメーターを正しいサイズで初期化する初期化関数を作成します。
学習可能なパラメーターは、入力観測値の次元と同じ数の次元をもちます。ここで、チャネル次元のサイズは入力データのチャネル次元と同じで、残りの次元はサイズが 1 です。入力の networkDataLayout
オブジェクトからサイズと形式の情報を抽出し、同じ数のチャネルで学習可能なパラメーターを初期化する関数 initialize
を作成します。
function layer = initialize(layer,layout)
% layer = initialize(layer,layout) initializes the layer
% learnable parameters using the specified input layout.
% Find number of channels.
idx = finddim(layout,"C");
numChannels = layout.Size(idx);
% Initialize empty learnable parameters.
sz = ones(1,numel(layout.Size);
sz(idx) = numChannels;
if isempty(layer.LeftSlope)
layer.LeftSlope = rand(sz);
end
if isempty(layer.RightSlope)
layer.RightSlope = rand(sz);
end
if isempty(layer.LeftThreshold)
layer.LeftThreshold = rand(sz);
end
if isempty(layer.RightThreshold)
layer.RightThreshold = rand(sz);
end
end
順方向関数の作成
予測時と学習時に使用する層の順方向関数を作成します。
"予測時" に層経由でデータを順伝播させて結果を出力する、predict
という名前の関数を作成します。
関数 predict
の構文は、層のタイプによって異なります。
Y = predict(layer,X)
は、層を介して入力データX
を転送し、結果Y
を出力します。この場合、layer
は、1 つの入力と 1 つの出力をもちます。[Y,state] = predict(layer,X)
は、更新された状態パラメーターstate
も出力します。この場合、layer
は 1 つの状態パラメーターをもちます。
複数の入力、複数の出力、または複数の状態パラメーターを使用して、層の構文を調整できます。
複数の入力をもつ層の場合、
X
をX1,...,XN
に置き換えます。ここで、N
は入力の数です。NumInputs
プロパティはN
と一致しなければなりません。複数の出力をもつ層の場合、
Y
をY1,...,YM
に置き換えます。ここで、M
は出力の数です。NumOutputs
プロパティはM
と一致しなければなりません。複数の状態パラメーターをもつ層の場合、
state
をstate1,...,stateK
に置き換えます。ここで、K
は状態パラメーターの数です。
ヒント
層への入力の数が変化する可能性がある場合、X1,…,XN
ではなく varargin
を使用します。この場合、varargin
は入力の cell 配列です。ここで、varargin{i}
は Xi
に対応します。
出力の数が変化する可能性がある場合、Y1,…,YM
ではなく varargout
を使用します。この場合、varargout
は出力の cell 配列です。ここで、varargout{j}
は Yj
に対応します。
ヒント
学習可能なパラメーターの dlnetwork
オブジェクトがカスタム層にある場合、カスタム層の関数 predict
内で、dlnetwork
の関数 predict
を使用します。これを行うと、dlnetwork
オブジェクトの関数 predict
は適切な層処理を使用して予測を行います。dlnetwork
に状態パラメーターがある場合、ネットワークの状態も返します。
SReLU 層の入力および出力はそれぞれ 1 つのみであるため、SReLU 層の predict
の構文は Y = predict(layer,X)
になります。
既定では、層は学習時に predict
を順方向関数として使用します。学習時に別の順方向関数を使用する、またはカスタム逆方向関数に必要な値を保持するには、forward
という名前の関数も作成しなければなりません。
入力の次元は、データのタイプと結合層の出力によって異なります。
層入力 | 例 | |
---|---|---|
形状 | データ形式 | |
2 次元イメージ | h×w×c×N の数値配列。ここで、h、w、c、および N は、それぞれイメージの高さ、幅、チャネル数、および観測値の数です。 | "SSCB" |
3 次元イメージ | h×w×d×c×N の数値配列。ここで、h、w、d、c、および N は、それぞれイメージの高さ、幅、深さ、チャネル数、およびイメージの観測値の数です。 | "SSSCB" |
ベクトル シーケンス | c×N×s の行列。ここで、c はシーケンスの特徴の数、N はシーケンスの観測値の数、s はシーケンス長です。 | "CBT" |
2 次元イメージ シーケンス | h×w×c×N×s の配列。ここで、h、w、および c はそれぞれイメージの高さ、幅、およびチャネル数に対応し、N はイメージ シーケンスの観測値の数、s はシーケンス長です。 | "SSCBT" |
3 次元イメージ シーケンス | h×w×d×c×N×s の配列。ここで、h、w、d、および c はそれぞれイメージの高さ、幅、深さ、チャネル数に対応し、N はイメージ シーケンスの観測値の数、s はシーケンスの長さです。 | "SSSCBT" |
特徴 | c 行 N 列の配列。ここで、c は特徴の数、N は観測値の数です。 | "CB" |
シーケンスを出力する層の場合、その層は、任意の長さのシーケンス、または時間次元をもたないデータを出力できます。
関数 forward
は "学習時" に層経由でデータを順伝播させ、メモリ値も出力します。
関数 forward
の構文は、層のタイプによって異なります。
Y = forward(layer,X)
は、層を介して入力データX
を転送し、結果Y
を出力します。この場合、layer
は、1 つの入力と 1 つの出力をもちます。[Y,state] = forward(layer,X)
は、更新された状態パラメーターstate
も出力します。この場合、layer
は 1 つの状態パラメーターをもちます。[__,memory] = forward(layer,X)
は、前述の構文のいずれかを使用して、カスタム関数backward
のメモリ値も返します。カスタム関数forward
とカスタム関数backward
の両方が層に存在する場合、順方向関数によってメモリ値が返されなければなりません。
複数の入力、複数の出力、または複数の状態パラメーターを使用して、層の構文を調整できます。
複数の入力をもつ層の場合、
X
をX1,...,XN
に置き換えます。ここで、N
は入力の数です。NumInputs
プロパティはN
と一致しなければなりません。複数の出力をもつ層の場合、
Y
をY1,...,YM
に置き換えます。ここで、M
は出力の数です。NumOutputs
プロパティはM
と一致しなければなりません。複数の状態パラメーターをもつ層の場合、
state
をstate1,...,stateK
に置き換えます。ここで、K
は状態パラメーターの数です。
ヒント
層への入力の数が変化する可能性がある場合、X1,…,XN
ではなく varargin
を使用します。この場合、varargin
は入力の cell 配列です。ここで、varargin{i}
は Xi
に対応します。
出力の数が変化する可能性がある場合、Y1,…,YM
ではなく varargout
を使用します。この場合、varargout
は出力の cell 配列です。ここで、varargout{j}
は Yj
に対応します。
ヒント
学習可能なパラメーターの dlnetwork
オブジェクトがカスタム層にある場合、カスタム層の関数 forward
内で、dlnetwork
オブジェクトの関数 forward
を使用します。これを行うと、dlnetwork
オブジェクトの関数 forward
は適切な層処理を使用して学習を行います。
SReLU 演算は次で与えられます。
ここで、xi はチャネル i の入力、tli と tri はそれぞれチャネル i の左と右のしきい値、ali と ari はそれぞれチャネル i の左と右のスケーリング係数です。これらのしきい値とスケーリング係数は学習可能なパラメーターとなり、学習時にその層によって学習されます。
この演算を predict
に実装します。SReLU 層では、学習にメモリまたは別の順方向関数が必要ないため、クラス ファイルから関数 forward
を削除できます。関数の構文を説明するコメントを関数の上部に追加します。
ヒント
zeros
のような関数を使用して配列を事前に割り当てる場合、これらの配列のデータ型が層関数の入力と一致していることを確認しなければなりません。別の配列と同じデータ型のゼロの配列を作成するには、zeros
の "like"
オプションを使用します。たとえば、配列 X
と同じデータ型でサイズが sz
のゼロの配列を初期化するには、Y = zeros(sz,"like",X)
を使用します。
function Y = predict(layer, X)
% Y = predict(layer, X) forwards the input data X through the
% layer and outputs the result Y.
tl = layer.LeftThreshold;
al = layer.LeftSlope;
tr = layer.RightThreshold;
ar = layer.RightSlope;
Y = (X <= tl) .* (tl + al.*(X-tl)) ...
+ ((tl < X) & (X < tr)) .* X ...
+ (tr <= X) .* (tr + ar.*(X-tr));
end
関数 predict
は dlarray
オブジェクトをサポートする関数のみを使用するため、関数 backward
の定義はオプションです。dlarray
オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。
完成した層
完成した層のクラス ファイルを表示します。
classdef sreluLayer < nnet.layer.Layer ... & nnet.layer.Acceleratable % Example custom SReLU layer. properties (Learnable) % Layer learnable parameters LeftSlope RightSlope LeftThreshold RightThreshold end methods function layer = sreluLayer(args) % layer = sreluLayer creates a SReLU layer. % % layer = sreluLayer(Name=name) also specifies the % layer name. arguments args.Name = ""; end % Set layer name. layer.Name = args.Name; % Set layer description. layer.Description = "SReLU"; end function layer = initialize(layer,layout) % layer = initialize(layer,layout) initializes the layer % learnable parameters using the specified input layout. % Find number of channels. idx = finddim(layout,"C"); numChannels = layout.Size(idx); % Initialize empty learnable parameters. sz = ones(1,numel(layout.Size); sz(idx) = numChannels; if isempty(layer.LeftSlope) layer.LeftSlope = rand(sz); end if isempty(layer.RightSlope) layer.RightSlope = rand(sz); end if isempty(layer.LeftThreshold) layer.LeftThreshold = rand(sz); end if isempty(layer.RightThreshold) layer.RightThreshold = rand(sz); end end function Y = predict(layer, X) % Y = predict(layer, X) forwards the input data X through the % layer and outputs the result Y. tl = layer.LeftThreshold; al = layer.LeftSlope; tr = layer.RightThreshold; ar = layer.RightSlope; Y = (X <= tl) .* (tl + al.*(X-tl)) ... + ((tl < X) & (X < tr)) .* X ... + (tr <= X) .* (tr + ar.*(X-tr)); end end end
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)を参照してください。
この例では、predict
で使用される MATLAB 関数はすべて、dlarray
オブジェクトをサポートしているため、層は GPU 互換です。
checkLayer
を使用したカスタム層の有効性のチェック
カスタム層 sreluLayer
について層の有効性をチェックします。
この例にサポート ファイルとして添付されているカスタム層 sreluLayer
は、入力データに SReLU 演算を適用します。この層にアクセスするには、この例をライブ スクリプトとして開きます。
層のインスタンスを作成します。
layer = sreluLayer;
層への典型的な入力に要求される入力サイズと形式を指定する networkDataFormat
オブジェクトを作成します。有効な入力サイズとして [24 24 20 128]
を指定します。ここで、各次元は、前の層の出力における高さ、幅、チャネル数、および観測値の数に対応します。形式を "SSCB"
(空間、空間、チャネル、バッチ) として指定します。
validInputSize = [24 24 20 128];
layout = networkDataLayout(validInputSize,"SSCB");
checkLayer
を使用して、層の有効性をチェックします。
checkLayer(layer,layout)
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: 20 Passed, 0 Failed, 0 Incomplete, 14 Skipped. Time elapsed: 0.28208 seconds.
この関数によって層に関する問題は検出されていません。
ネットワークにカスタム層を含める
Deep Learning Toolbox では、カスタム層を他の層と同じように使用できます。このセクションでは、前に作成した SReLU 層を使用して数字分類用ネットワークを作成し、学習させる方法を説明します。
例の学習データを読み込みます。
load DigitsDataTrain
この例にサポート ファイルとして添付されているカスタム層 sreluLayer
を含む層配列を作成します。この層にアクセスするには、この例をライブ スクリプトとして開きます。
layers = [ imageInputLayer([28 28 1]) convolution2dLayer(5,20) batchNormalizationLayer sreluLayer fullyConnectedLayer(10) softmaxLayer];
学習オプションを設定し、関数trainnet
を使用してニューラル ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。既定では、関数 trainnet
は利用可能な GPU がある場合にそれを使用します。GPU での学習には、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数 trainnet
は CPU を使用します。実行環境を指定するには、ExecutionEnvironment
学習オプションを使用します。
options = trainingOptions("adam",MaxEpochs=10,Metrics="accuracy"); net = trainnet(XTrain,labelsTrain,layers,"crossentropy",options);
Iteration Epoch TimeElapsed LearnRate TrainingLoss TrainingAccuracy _________ _____ ___________ _________ ____________ ________________ 1 1 00:00:01 0.001 2.6767 10.156 50 2 00:00:09 0.001 0.68524 74.219 100 3 00:00:18 0.001 0.46823 86.719 150 4 00:00:27 0.001 0.23939 93.75 200 6 00:00:33 0.001 0.096779 99.219 250 7 00:00:38 0.001 0.045862 100 300 8 00:00:42 0.001 0.050238 100 350 9 00:00:45 0.001 0.033407 100 390 10 00:00:49 0.001 0.032987 100 Training stopped: Max epochs completed
テスト イメージを分類し、精度を計算することによって、ネットワーク性能を評価します。複数の観測値を使用して予測を行うには、関数minibatchpredict
を使用します。予測スコアをラベルに変換するには、関数scores2label
を使用します。関数 minibatchpredict
は利用可能な GPU がある場合に自動的にそれを使用します。
load DigitsDataTest
scores = minibatchpredict(net,XTest);
classNames = categories(labelsTest);
YTest = scores2label(scores,classNames);
accuracy = mean(YTest==labelsTest)
accuracy = 0.9588
参照
[1] Hu, Xiaobin, Peifeng Niu, Jianmei Wang, and Xinxin Zhang. “A Dynamic Rectified Linear Activation Units.” IEEE Access 7 (2019): 180409–16. https://doi.org/10.1109/ACCESS.2019.2959036.
参考
trainnet
| trainingOptions
| dlnetwork
| functionLayer
| checkLayer
| setLearnRateFactor
| setL2Factor
| getLearnRateFactor
| getL2Factor
| findPlaceholderLayers
| replaceLayer
| PlaceholderLayer
| networkDataLayout