主要内容

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

入れ子になった深層学習層の定義

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

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

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

  • コントロールフローをもつネットワークの作成。入力データに応じてネットワークの一部を動的に変更できるようにする場合など。

  • ループをもつネットワークの作成。ネットワークの一部がその出力を自分自身にフィードバックする場合など。

詳細については,深層学習のネットワーク構成を参照してください。

この例では,残差ブロックを表すカスタム層を作成する方法を説明します。カスタム層residualBlockLayerは,畳み込み層,グループ正規化層,ReLU層,加算層から成る学習可能な層ブロックで構成され,スキップ接続も含んでいます。スキップ接続には,オプションとして畳み込み層とグループ正規化層が含まれることがあります。次の図に,残差ブロックの構造を示します。

残块结构。它包含一个卷积,一个组归一化,一个ReLU,一个第二卷积,一个第二组归一化,一个加法和一个串联的ReLU层。从块输入到添加层有一个跳过连接。在跳跃式连接上还有另一个串联的卷积和群归一化层。出现在跳过连接上的层被高亮显示为可选。

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

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

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

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

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

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

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

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

classdefmyLayer < nnet.layer.Layer属性%(可选)图层属性。%图层属性到这里。结束属性(可学的)%(可选)层可学习参数。%图层学习参数到这里。结束方法函数层= myLayer ()%(可选)创建一个myLayer。%该函数必须与类名相同。%层构造函数在这里。结束函数[Z1,…,Zm] = predict(layer, X1,…,Xn)%在预测时间通过层转发输入数据%输出结果。%的输入:% layer -要转发的层% X1,…,Xn - Input data%输出:% Z1,…,Zm - Outputs of layer forward function%用于预测的层前向函数在这里。结束函数(Z1,…,Zm评选、内存)=前进(层,X1,…,Xn)%(可选)在训练时通过层转发输入数据%时间并输出结果和一个内存值。%的输入:% layer -要转发的层% X1,…,Xn - Input data%输出:% Z1,…,Zm - Outputs of layer forward function% memory -自定义向后传播的内存值%用于训练的图层正向功能在这里。结束函数[dLdX1,…,dLdXn, dLdW1,…,dLdWk] =...向后(层,X1,…,Xn Z1,…,Zm评选,dLdZ1,…,dLdZm,内存)%(可选)反向传播损失的导数%函数通过层。%的输入:%图层-图层向后传播通过% X1,…,Xn - Input data% Z1,…,Zm - Outputs of layer forward function% dLdZ1,…,dLdZm - Gradients propagated from the next layers% memory - forward函数的内存值%输出:% dLdX1,…,dLdXn - Derivatives of the loss with respect to the%的输入% dLdW1,…,dLdWk - Derivatives of the loss with respect to each%可学的参数%图层向后函数在这里。结束结束结束

層の命名

まず,層に名前を付けます。クラスファイルの最初の行で,既存の名前myLayerresidualBlockLayerに置き換えます。

classdefresidualBlockLayer < nnet.layer.Layer...结束

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

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

層の保存

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

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

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

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

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

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

类型 層のタイプ。文字ベクトルまたは字符串スカラーとして指定します。类型の値は,層が配列に表示されるときに表示されます。層のタイプを指定しない場合、層のクラス名が表示されます。
NumInputs 層の入力の数。正の整数として指定します。この値を指定しない場合,NumInputsInputNamesの名前の数に自動的に設定されます。既定値は1です。
InputNames 層の入力の名前。文字ベクトルの细胞配列として指定します。この値を指定せず,NumInputsが1より大きい場合,InputNames{“三机”,…,“客栈”}に自動的に設定されます。ここで,NNumInputsです。既定値は{'在'}です。
NumOutputs 層の出力の数。正の整数として指定します。この値を指定しない場合,NumOutputsOutputNamesの名前の数に自動的に設定されます。既定値は1です。
OutputNames 層の出力の名前。文字ベクトルの细胞配列として指定します。この値を指定せず,NumOutputsが1より大きい場合,OutputNames{着干活,…,“outM”}に自動的に設定されます。ここで,NumOutputsです。既定値は{“出”}です。

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

ヒント

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

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

このカスタム層で唯一の学習可能なパラメーターは,dlnetworkオブジェクトとして指定された残差ブロック自体です。この学習可能なパラメーターを属性(可学的)セクションで宣言し,パラメーター网络を呼び出します。

属性(可学的)%层可学习的参数%残块。网络结束

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

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

残差ブロック層のコンストラクター関数には,入力引数が5つ必要です。

  • 層の入力サイズ

  • 畳み込みフィルターの数

  • ストライド(オプション。ストライドの既定値は1)

  • スキップ接続に畳み込み層を含めるためのフラグ(オプション。フラグの既定値は

  • 層の名前(オプション。既定の名前は''

コンストラクター関数residualBlockLayerで,inputSizenumFiltersという名前をもつ2つの必須入力引数を指定し,オプションの引数をNameValueArgsという名前をもつ名前と値のペアとして指定します。関数の構文を説明するコメントを関数の上部に追加します。

函数层= residualBlockLayer (inputSize numFilters NameValueArgs)% layer = residualBlockLayer(inputSize,numFilters)创建一个%剩余块层与指定的输入大小和数量%的过滤器。% layer = residualBlockLayer(inputSize,numFilters,Name,Value)%指定使用一个或多个名称值的附加选项%对:% 'Stride' -卷积运算的Stride%(默认为1)% ' incleskipconvolution ' -包含卷积的标志%跳过连接%(默认错误)% 'Name' -图层名称%(默认)...结束

入力引数の解析

参数ブロックを使用して入力引数を解析します。関数構文と同じ順序で引数をリストし、既定値を指定します。その後、入力NameValueArgsから値を抽出します。

%解析输入参数。参数inputSize numFilters NameValueArgs。Stride = 1 NameValueArgs。NameValueArgs. incleskipconvolution = false NameValueArgs. incleskipconvolution = falseName =''结束步= NameValueArgs.Stride;includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;= NameValueArgs.Name名称;

層のプロパティの初期化

コンストラクター関数で,層のプロパティ(dlnetworkオブジェクトなど)を初期化します。コメント%层构造函数在这里を,層のプロパティを初期化するコードに置き換えます。

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

%设置图层名称。层。Name =的名字;

層の描述プロパティを設定して,層に1行の説明を指定します。層とプロパティ(オプション)の説明を設定します。

%设置图层描述。描述=“残块带”+ numFilters +“过滤器,大步前进”+步伐;如果include eskipconvolution description = description +",跳过卷积"结束层。描述=描述;

类型プロパティを設定して層のタイプを指定します。类型の値は,層が配列に表示されるときに表示されます。

%设置图层类型。层。类型=“剩余块”

残差ブロックを定義します。まず,ブロックの主要層を含む層配列を作成し,その配列を層グラフに変換します。この層グラフには入力層がなければなりません。

定义嵌套层图。[imageInputLayer(inputSize,“归一化”“没有”“名字”“在”) convolution2dLayer (3 numFilters“填充”“相同”“步”步,“名字”“conv1”) groupNormalizationLayer (所有渠道的“名字”“gn1”) reluLayer (“名字”“relu1”) convolution2dLayer (3 numFilters“填充”“相同”“名字”“conv2”) groupNormalizationLayer (“channel-wise”“名字”“gn2”) additionLayer (2“名字”“添加”) reluLayer (“名字”“relu2”));lgraph = layerGraph(层);

次に,スキップ接続を追加します。includeSkipConvolutionフラグが真正的の場合は,畳み込み層とグループ正規化層をスキップ接続に含めます。

%添加跳过连接。如果include eskipconvolution layers =[卷积2dlayer (1,numFilters,“步”步,“名字”“convSkip”) groupNormalizationLayer (所有渠道的“名字”“gnSkip”));lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph,“在”“convSkip”);lgraph = connectLayers (lgraph,“gnSkip”“添加/ in2”);其他的lgraph = connectLayers (lgraph,“在”“添加/ in2”);结束

最後に,層グラフをdlnetworkオブジェクトに変換し,層の网络プロパティを設定します。

%转换为dlnetwork。dlnet = dlnetwork (lgraph);%设置网络属性。层。Network = dlnet;

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

函数层= residualBlockLayer (inputSize numFilters NameValueArgs)% layer = residualBlockLayer(inputSize,numFilters)创建一个%剩余块层与指定的输入大小和数量%的过滤器。% layer = residualBlockLayer(inputSize,numFilters,Name,Value)%指定使用一个或多个名称值的附加选项%对:% 'Stride' -卷积运算的Stride%(默认为1)% ' incleskipconvolution ' -包含卷积的标志%跳过连接%(默认错误)% 'Name' -图层名称%(默认)%解析输入参数。参数inputSize numFilters NameValueArgs。Stride = 1 NameValueArgs。NameValueArgs. incleskipconvolution = false NameValueArgs. incleskipconvolution = falseName =''结束步= NameValueArgs.Stride;includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;= NameValueArgs.Name名称;%设置图层名称。层。Name =的名字;%设置图层描述。描述=“残块带”+ numFilters +“过滤器,大步前进”+步伐;如果include eskipconvolution description = description +",跳过卷积"结束层。描述=描述;%设置图层类型。层。类型=“剩余块”定义嵌套层图。[imageInputLayer(inputSize,“归一化”“没有”“名字”“在”) convolution2dLayer (3 numFilters“填充”“相同”“步”步,“名字”“conv1”) groupNormalizationLayer (所有渠道的“名字”“gn1”) reluLayer (“名字”“relu1”) convolution2dLayer (3 numFilters“填充”“相同”“名字”“conv2”) groupNormalizationLayer (“channel-wise”“名字”“gn2”) additionLayer (2“名字”“添加”) reluLayer (“名字”“relu2”));lgraph = layerGraph(层);%添加跳过连接。如果include eskipconvolution layers =[卷积2dlayer (1,numFilters,“步”步,“名字”“convSkip”) groupNormalizationLayer (所有渠道的“名字”“gnSkip”));lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph,“在”“convSkip”);lgraph = connectLayers (lgraph,“gnSkip”“添加/ in2”);其他的lgraph = connectLayers (lgraph,“在”“添加/ in2”);结束%转换为dlnetwork。dlnet = dlnetwork (lgraph);%设置网络属性。层。Network = dlnet;结束

このコンストラクター関数を使用すると,入力サイズが(32 32 64)64年で個のフィルターとストライド2をもち,スキップ接続内に畳み込み層をもつ“res5”という名前の残差ブロック層が,コマンドresidualBlockLayer([32 32 64], 64,“步”,2、“IncludeSkipConvolution”,没错,“名字”,“res5”)によって作成されます。

順方向関数の作成

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

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

预测の構文は,以下のとおりです。

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

ヒント

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

ヒント

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

残差ブロックの入力および出力はそれぞれ1つのみであるため,カスタム層の预测の構文はZ =预测(层,X)になります。

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

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

層入力 入力サイズ 観察値の次元
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

残差ブロック層の場合,層のフォワードパスは単純にdlnetworkオブジェクトのフォワードパスになります。dlnetworkオブジェクトに入力データを渡すには,まず,そのデータを書式付きdlarrayオブジェクトに変換しなければなりません。

この演算をカスタム層の関数预测に実装します。予測用にdlnetworkのフォワードパスを実行するには,dlnetworkオブジェクトの関数预测を使用します。

学習時のdlnetworkオブジェクトの動作は同じであり,残差ブロック層では学習にメモリまたは別の順方向関数が必要ないため,クラスファイルから関数向前を削除できます。

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

函数Z =预测(层,X)%在预测时间通过层转发输入数据%输出结果。%的输入:% layer -要转发的层% X -输入数据%输出:% Z -层前向函数的输出%将输入数据转换为格式化的dlarray。X = dlarray (X,“SSCB”);%使用网络进行预测。dlnet = layer.Network;Z =预测(dlnet X);条形尺寸标签。Z = stripdims (Z);结束

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

完成した層

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

classdefresidualBlockLayer < nnet.layer.Layer%使用实例自定义残留块层。属性(可学的)%层可学习的参数%残块。网络结束方法函数层= residualBlockLayer (inputSize numFilters NameValueArgs)% layer = residualBlockLayer(inputSize,numFilters)创建一个%剩余块层与指定的输入大小和数量%的过滤器。% layer = residualBlockLayer(inputSize,numFilters,Name,Value)%指定使用一个或多个名称值的附加选项%对:% 'Stride' -卷积运算的Stride%(默认为1)% ' incleskipconvolution ' -包含卷积的标志%跳过连接%(默认错误)% 'Name' -图层名称%(默认)%解析输入参数。参数inputSize numFilters NameValueArgs。Stride = 1 NameValueArgs。NameValueArgs. incleskipconvolution = false NameValueArgs. incleskipconvolution = falseName =''结束步= NameValueArgs.Stride;includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;= NameValueArgs.Name名称;%设置图层名称。层。Name =的名字;%设置图层描述。描述=“残块带”+ numFilters +“过滤器,大步前进”+步伐;如果include eskipconvolution description = description +",跳过卷积"结束层。描述=描述;%设置图层类型。层。类型=“剩余块”定义嵌套层图。[imageInputLayer(inputSize,“归一化”“没有”“名字”“在”) convolution2dLayer (3 numFilters“填充”“相同”“步”步,“名字”“conv1”) groupNormalizationLayer (所有渠道的“名字”“gn1”) reluLayer (“名字”“relu1”) convolution2dLayer (3 numFilters“填充”“相同”“名字”“conv2”) groupNormalizationLayer (“channel-wise”“名字”“gn2”) additionLayer (2“名字”“添加”) reluLayer (“名字”“relu2”));lgraph = layerGraph(层);%添加跳过连接。如果include eskipconvolution layers =[卷积2dlayer (1,numFilters,“步”步,“名字”“convSkip”) groupNormalizationLayer (所有渠道的“名字”“gnSkip”));lgraph = addLayers (lgraph层);lgraph = connectLayers (lgraph,“在”“convSkip”);lgraph = connectLayers (lgraph,“gnSkip”“添加/ in2”);其他的lgraph = connectLayers (lgraph,“在”“添加/ in2”);结束%转换为dlnetwork。dlnet = dlnetwork (lgraph);%设置网络属性。层。Network = dlnet;结束函数Z =预测(层,X)%在预测时间通过层转发输入数据%输出结果。%的输入:% layer -要转发的层% X -输入数据%输出:% Z -层前向函数的输出%将输入数据转换为格式化的dlarray。X = dlarray (X,“SSCB”);%使用网络进行预测。dlnet = layer.Network;Z =预测(dlnet X);条形尺寸标签。Z = stripdims (Z);结束结束结束

GPU互換性

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

多くのMATLAB組み込み関数が入力引数gpuArray(并行计算工具箱)およびdlarrayをサポートしています。dlarrayオブジェクトをサポートしている関数の一覧については,dlarrayをサポートする関数の一覧を参照してください。GPUで実行される関数の一覧については,GPUでのMATLAB関数の実行(并行计算工具箱)を参照してください。深層学習にGPUを使用するには,以3.0计算能力上のCUDA®対応英伟达®GPUも必要です。MATLABでのGPUの使用の詳細は,MATLABでのGPU計算(并行计算工具箱)を参照してください。

この例では,预测で使用されるMATLAB関数はすべて,dlarrayオブジェクトをサポートしているため,層はGPU互換です。

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

関数checkLayerを使用して,カスタム層residualBlockLayerについて層の有効性をチェックします。

残差ブロック層のインスタンスを作成します。この層にアクセスするには,この例をライブスクリプトとして開きます。

inputSize = [56 56 64];numFilters = 64;层= residualBlockLayer (inputSize numFilters)
“Learnable Parameters Network: [1x1 dlnetwork] Show all properties .

関数checkLayerを使用して,層の有効性をチェックします。層には4次元配列を入力する必要があり,最初の3つの次元は前の層の出力における高さ,幅,およびチャネル数に対応し,4番目の次元は観測値に対応します。層の構築時に使用したサイズに等しい有効な入力サイズを指定し,“ObservationDimension”オプションを4に設定します。

validInputSize = inputSize;validInputSize checkLayer(层,“ObservationDimension”4)
跳过GPU测试。没有找到兼容的GPU设备。跳过代码生成兼容性测试。要检查代码生成层的有效性,请指定“CheckCodegenCompatibility”和“ObservationDimension”选项。运行nnet.checklayer.TestLayerWithoutBackward .......... ...完成nnet.checklayer.TestLayerWithoutBackward __________测试摘要:13通过,0失败,0不完整,8跳过。时间:3.434秒。

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

参考

|||||

関連するトピック