主要内容

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

コ,ド生成用のカスタム深層学習層の定義

目的の分類または回帰問題に必要な層が深度学习工具箱™に用意されていない場合,この例を指針として使用して独自のカスタム層を定義できます。組み込まれている層の一覧にいては,深層学習層の一覧を参照してください。

カスタム深層学習層を定義するために,この例で提供するテンプレ,トを使用できます。この例では,次のステップで説明を進めます。

  1. 層の命名- matlab®で使用できるように層に名前を付けます。

  2. 層のプロパティの宣言-層のプロパティと,学習中にどのパラメタが学習されるかを指定します。

  3. コンストラクタ関数の作成(オプション)—層の構築とそのプロパティ初期化の方法を指定します。コンストラクタ,関数を指定しない場合,作成時に的名字描述,および类型の各プロパティは[]で初期化され,層の入力および出力の数は1に設定されます。

  4. 順方向関数の作成——予測時および学習時に層経由でデータを順方向にパス(順伝播)する方法を指定します。

  5. 逆方向関数の作成(オプション)——入力データおよび学習可能なパラメーターにおける損失の微分を指定します(逆伝播)。逆方向関数を指定しない場合,順方向関数はdlarrayオブジェクトをサポ,トしなければなりません。

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

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

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

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

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

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

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

  • スカラ,のプロパティは,数値型,逻辑型,または字符串型でなければなりません。

コド生成では,2次元メジ入力または特徴入力のみで中間層がサポトされます。コ,ド生成は,状態プロパティ(属性が状态であるプロパティ)をも層をサポトしません。

この例では,学習可能なパラメ,タ,を含む層であるPReLU層[1]を作成し,畳み込みニュ,ラルネットワ,クで使用する方法を説明します。PReLU層はしきい値処理を実行します。各チャネルにいて,入力値がゼロよりも小さい場合は,学習時に得られたスカラによって乗算されます。0より小さい値の場合,PReLU層は入力の各チャネルにスケ,リング係数 α を適用します。これらの係数は学習可能なパラメ,タ,となり,学習時にその層によって学習されます。

[1]から抜粋した次の図は,ReLU層の関数とPReLU層の関数を比較したものです。

学習可能なパラメ,タ,を含む層のテンプレ,ト

学習可能なパラメタを含む層のテンプレトをmatlabの新しいファルにコピします。このテンプレートは,学習可能なパラメーターを含む層の構造の概要を示しており,層の動作を定義する関数を含んでいます。

classdefmyLayer < nnet.layer.Layer可格式化(可选)属性%(可选)图层属性。图层属性在这里。结束属性(可学的)%(可选)层可学习参数。%层可学习参数在这里。结束方法函数图层= myLayer()(可选)创建myLayer。此函数必须与类名称相同。%层构造函数在这里。结束函数[Z1,…,Zm] = predict(layer, X1,…,Xn)在预测时间通过层转发输入数据%输出结果。%的输入:% layer -向前传播的层% x1,…, Xn -输入数据%输出:,…, Zm -层前向函数的输出用于预测的层正向函数在这里。结束函数(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn)%(可选)训练时通过层向前输入数据%时间,并输出结果和内存值。%的输入:% layer -向前传播的层% x1,…, Xn -输入数据%输出:,…, Zm -层前向函数的输出% memory -自定义向后传播的内存值用于训练的层正向函数在这里。结束函数[dLdX1,…,dLdXn, dLdW1,…,dLdWk] =...向后(层,X1,…,Xn Z1,…,Zm评选,dLdZ1,…,dLdZm,内存)%(可选)反向传播损失的导数%函数通过层。%的输入:% layer -向后传播的层% x1,…, Xn -输入数据,…, Zm -层前向函数的输出,…, dLdZm -从下一层传播的梯度% memory -前向函数的内存值%输出:,…, dLdXn -损失相对于的导数%的输入% ddw1,…, dLdWk -各损失的导数%可学习参数%图层反向函数在这里。结束结束结束

層の命名

まず,層に名前を付けます。クラスファesc escルの最初の行で,既存の名前myLayercodegenPreluLayerに置き換え,層を説明するコメントを追加します。

classdefcodegenPreluLayer < nnet.layer.Layer示例自定义PReLU层,支持代码生成。金宝app...结束

次に,コンストラクタ,関数myLayer方法セクションの最初の関数)の名前を層と同じ名前に変更します。

方法函数layer = codegenPreluLayer()…结束...结束

層の保存

層のクラスファ@ @ルをcodegenPreluLayer.mという名前の新しいファ@ @ルに保存します。このファ@ @ル名は層の名前に一致しなければなりません。この層を使用するには,このファイルを現在のフォルダーまたはMATLABパス上のフォルダーに保存しなければなりません。

コ,ド生成プラグマの指定

この層のコ,ドを生成することを示すため,層の定義に% # codegen命令(プラグマ)を追加します。この命令は,MATLABコードアナライザーに対し,コード生成時のエラーの原因となる違反を診断して修正するのに役立つ情報を提供するよう指示します。

classdefcodegenPreluLayer < nnet.layer.Layer示例自定义PReLU层,支持代码生成。金宝app% # codegen...结束

プロパティおよび学習可能なパラメ,タ,の宣言

層のプロパティを属性セクションで宣言し,学習可能なパラメ,タ,を属性(可学的)セクションにリストすることによって宣言します。

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

财产 説明
的名字 層の名前。文字ベクトルまたは字符串スカラ,として指定します。配列入力の場合,関数trainNetworkassembleNetworklayerGraph,およびdlnetworkでは,的名字が設定され,層の名前が自動的に割り当てられます。
描述

層にいての1行の説明。字符串スカラ,または文字ベクトルとして指定します。この説明は,層が配列に表示されるときに表示されます。

層の説明を指定しない場合,層のクラス名が表示されます。

类型

層のタ@ @プ。文字ベクトルまたは字符串スカラ,として指定します。类型の値は,層が配列に表示されるときに表示されます。

層のタesc escプを指定しない場合,層のクラス名が表示されます。

NumInputs 層の入力の数。正の整数として指定します。この値を指定しない場合,NumInputsInputNamesの名前の数に自動的に設定されます。既定値は1です。
InputNames 層の入力の名前。文字ベクトルのcell配列として指定します。この値を指定せず,NumInputsが1より大きい場合,InputNames{“三机”,…,“客栈”}に自動的に設定されます。ここで,NNumInputsです。既定値は{'在'}です。
NumOutputs 層の出力の数。正の整数として指定します。この値を指定しない場合,NumOutputsOutputNamesの名前の数に自動的に設定されます。既定値は1です。
OutputNames 層の出力の名前。文字ベクトルのcell配列として指定します。この値を指定せず,NumOutputsが1より大きい場合,OutputNames{着干活,…,“outM”}に自動的に設定されます。ここで,NumOutputsです。既定値は{“出”}です。

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

ヒント

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

コ,ド生成をサポ,トするには,次のことが必要です。

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

  • スカラ,のプロパティは,数値型,逻辑型,または字符串型でなければなりません。

PReLU層には追加のプロパティが必要ないため,属性セクションは削除できます。

PReLU層には,唯一の学習可能なパラメ,タ,としてスケ,リング係数aがあります。この学習可能なパラメ,タ,を属性(可学的)セクションで宣言し,パラメ,タ,αを呼び出します。

属性(可学的)%层可学习参数%结垢系数α结束

コンストラクタ,関数の作成

層を構築する関数を作成し,層のプロパティを初期化します。層を作成するために必要な変数をコンストラクタ,関数への入力として指定します。

PReLU層のコンストラクター関数に必要な2つの入力引数は,想定される入力データのチャネル数と層の名前です。チャネルの数は学習可能なパラメタαのサ@ @ズを指定します。numChannelsおよび的名字という名前の2の入力引数を関数codegenPreluLayerに指定します。関数の構文を説明するコメントを関数の上部に追加します。

函数层= codegenPreluLayer(numChannels, name)% layer = codegenPreluLayer(numChannels)创建PReLU层% numChannels通道并指定层名。...结束

コ,ド生成では参数ブロックがサポ,トされていません。

層のプロパティの初期化

コンストラクタ,関数に学習可能なパラメ,タ,を含め,層のプロパティを初期化します。コメント%层构造函数在这里を,層のプロパティを初期化するコ,ドに置き換えます。

的名字プロパティを入力引数的名字に設定します。

设置层名。层。的名字=的名字;

層の描述プロパティを設定して,層に1行の説明を指定します。層のタ▪▪プとサ▪▪ズの説明を設定します。

设置层描述。层。描述=“PReLU with”+ numChannels +“通道”

PReLU層の場合,入力値が負であれば,層は入力の各チャネルにαの対応するチャネルを乗算します。学習可能なパラメタαをサesc escズ1 x 1 xnumChannelsのランダムベクトルとして初期化します。3目の次元をサズnumChannelsに指定することで,層は順方向関数で入力の要素単位の乗算を使用できます。αは層オブジェクトのプロパティであるため,ベクトルを层。αに割り当てなければなりません。

初始化缩放系数。层。α=rand([1 1 numChannels]);

完成したコンストラクタ,関数を表示します。

函数层= codegenPreluLayer(numChannels, name)% layer = codegenPreluLayer(numChannels, name)创建一个PReLU%层用于2-D图像输入numChannels通道和指定%层名。设置层名。层。的名字=的名字;设置层描述。层。描述=“PReLU with”+ numChannels +“通道”初始化缩放系数。层。α=rand([1 1 numChannels]);结束

このコンストラクタ,関数を使用すると,コマンドcodegenPreluLayer(“prelu”)により3のチャネルを持,名前が“prelu”のPReLU層が作成されます。

順方向関数の作成

予測時と学習時に使用する層の順方向関数を作成します。

“予測時”に層経由でデ,タを順伝播させて結果を出力する,预测という名前の関数を作成します。

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

ヒント

预测への入力の数が変化する可能性がある場合,X1,…,Xnではなく变长度输入宗量を使用します。この場合,变长度输入宗量は入力のcell配列です。ここで,变长度输入宗量{我}西に対応します。出力の数が変化する可能性がある場合、Z1,…,Zm评选ではなくvarargoutを使用します。この場合,varargoutは出力のcell配列です。ここで,varargout {j}Zjに対応します。

PReLU層の入力および出力はそれぞれ1のみであるため,PReLU層の预测の構文はZ = predict(图层,X)になります。

コド生成では,2次元メジ入力のみでカスタム中間層がサポトされます。入力は,高x宽x c x Nの配列です。ここで,h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。N は観測値の数です。観測値の次元は 4 です。

コ、ド生成のサポ、トでは、層入力すべての次元数およびバッチサ、ズは同じでなければなりません。

既定では,層は学習時に预测を順方向関数として使用します。学習時に別の順方向関数を使用する,またはカスタム逆方向関数に必要な値を保持するには,向前という名前の関数も作成しなければなりません。ソフトウェアは関数向前のコ,ドを生成しませんが,コ,ド生成の互換性がなければなりません。

関数向前“学習時”に層経由でデ,タを順伝播させ,メモリ値も出力します。

向前の構文は[Z1,…,Zm,memory] = forward(layer,X1,…,Xn)です。ここで,X1,…,Xnn個の層入力,Z1,…,Zm评选個の層出力,内存は層のメモリです。

ヒント

向前への入力の数が変化する可能性がある場合,X1,…,Xnではなく变长度输入宗量を使用します。この場合,变长度输入宗量は入力のcell配列です。ここで,变长度输入宗量{我}西に対応します。出力の数が変化する可能性がある場合、Z1,…,Zm评选ではなくvarargoutを使用します。この場合,varargoutは出力のcell配列です。ここで,j= 1,…,NumOutputsにいてvarargout {j}Zjに対応し,varargout{NumOutputs + 1}内存に対応します。

PReLU演算は次の式で表されます。

f x x 如果 x > 0 α x 如果 x 0

ここで, x はチャネル我の非線形活性化fの入力, α は負の部分の勾配を制御する係数です。 α の添字我は,別のチャネルでは非線形活性化が変わる場合があることを示しています。

この演算を预测に実装します。预测では,入力Xがこの方程式のxに対応します。出力Z f x に対応します。

関数の構文を説明するコメントを関数の上部に追加します。

ヒント

0のような関数を使用して配列を事前に割り当てる場合,これらの配列のデータ型が層関数の入力と一致していることを確認しなければなりません。別の配列と同じデ,タ型のゼロの配列を作成するには,0“喜欢”オプションを使用します。たとえば,配列Xと同じデタ型でサズが深圳のゼロの配列を初期化するには,Z = 0 (sz,'like',X)を使用します。

順方向関数がdlarray入力を完全にサポ,トしている場合,関数落后的の実装はオプションです。コ,ド生成のサポ,トでは,関数预测が数値入力もサポ,トしなければなりません。

PReLU演算の出力を計算する1の方法は,次のコドを使用することです。

Z = max(X,0) +层。* min(0,X);
コ,ド生成では,. *演算を使用した暗黙的な拡張がサポ,トされないため,代わりに関数bsxfunを使用できます。
Z = max(X,0) + bsxfun(@times, layer。α,最小值(0,X));
ただし,bsxfunではdlarray入力がサポ,トされません。コ,ド生成とdlarray入力の両方をサポ,トする関数预测を実装するには,如果ステ,トメントと関数isdlarrayを使用して,入力タ。

函数Z = predict(图层,X)% Z = predict(layer, X)将输入数据X通过并输出结果Z。如果isdlarray(X) Z = max(X,0) + layer。* min(0,X);其他的Z = max(X,0) + bsxfun(@times, layer。α,最小值(0,X));结束结束

関数预测dlarrayオブジェクトを完全にサポ,トするため,関数落后的の定義はオプションです。dlarrayオブジェクトをサポトしている関数の一覧にいては,Dlarrayをサポ,トする関数の一覧を参照してください。

完成した層

完成した層のクラスファ@ @ルを表示します。

classdefcodegenPreluLayer < nnet.layer.Layer示例自定义PReLU层,支持代码生成。金宝app% # codegen属性(可学的)%层可学习参数%结垢系数α结束方法函数层= codegenPreluLayer(numChannels, name)% layer = codegenPreluLayer(numChannels, name)创建一个PReLU%层用于2-D图像输入numChannels通道和指定%层名。设置层名。层。的名字=的名字;设置层描述。层。描述=“PReLU with”+ numChannels +“通道”初始化缩放系数。层。α=rand([1 1 numChannels]);结束函数Z = predict(图层,X)% Z = predict(layer, X)将输入数据X通过并输出结果Z。如果isdlarray(X) Z = max(X,0) + layer。* min(0,X);其他的Z = max(X,0) + bsxfun(@times, layer。α,最小值(0,X));结束结束结束结束

コ,ド生成の互換性に関するカスタム層のチェック

カスタム層codegenPreluLayerにいて,コド生成の互換性をチェックします。

この例にサポトファルとして添付されているカスタム層codegenPreluLayerは,入力デ,タにPReLU演算を適用します。この層にアクセスするには,この例をラ。

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

観測値の入力の典型的なサ电子邮箱ズを指定し,“ObservationDimension”オプションを4に設定します。コ,ド生成の互換性をチェックするには,CheckCodegenCompatibilityオプションを真正的に設定します。関数checkLayerは,関数がコ,ド生成と互換性があるかどうかをチェックしません。カスタム層定義がコード生成でサポートされているかどうかをチェックするには、まず“コ,ド生成の準備状態”アプリを使用します。詳細にいては,コド生成の準備状態ドのチェック(MATLAB编码器)を参照してください。

层= codegenPreluLayer(20,“prelu”);validInputSize = [24 24 20];checkLayer(层、validInputSize ObservationDimension = 4, CheckCodegenCompatibility = true)
跳过GPU测试。没有找到兼容的GPU设备。运行nnet.checklayer.TestLayerWithoutBackward  .......... .......... ...完成nnet.checklayer.TestLayerWithoutBackward __________测试总结:23通过,0失败,0不完整,5跳过。时间流逝:0.79448秒。

この関数によって層に関する問題は検出されていません。

参照

[1]“深入研究整流器:在ImageNet分类上超越人类水平的性能。”2015年IEEE计算机视觉国际会议(ICCV) 1026-34。圣地亚哥,智利:IEEE, 2015。https://doi.org/10.1109/ICCV.2015.123。

参考

|

関連するトピック