このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
目的の分類または回帰問題に必要な層が深度学习工具箱™に用意されていない場合,この例を指針として使用して独自のカスタム層を定義できます。組み込まれている層の一覧については,深層学習層の一覧を参照してください。
それ自体が層グラフを定義するカスタム層を作成するには,学習可能なパラメーターとしてdlnetwork
オブジェクトを指定できます。これは“ネットワーク構成“と呼ばれます。以下の場合にネットワーク構成を使用できます。
学習可能な層のブロックを表す単一のカスタム層の作成。残差ブロックなど。
コントロールフローをもつネットワークの作成。入力データに応じてネットワークの一部を動的に変更できるようにする場合など。
ループをもつネットワークの作成。ネットワークの一部がその出力を自分自身にフィードバックする場合など。
詳細については,深層学習のネットワーク構成を参照してください。
この例では,残差ブロックを表すカスタム層を作成する方法を説明します。カスタム層residualBlockLayer
は,畳み込み層,グループ正規化層,ReLU層,加算層から成る学習可能な層ブロックで構成され,スキップ接続も含んでいます。スキップ接続には,オプションとして畳み込み層とグループ正規化層が含まれることがあります。次の図に,残差ブロックの構造を示します。
カスタム深層学習層を定義するために,この例で提供するテンプレートを使用できます。この例では,次のステップで説明を進めます。
層の命名——MATLAB®で使用できるように層に名前を付けます。
層のプロパティの宣言——層のプロパティと,学習中にどのパラメーターが学習されるかを指定します。
コンストラクター関数の作成(オプション)——層の構築とそのプロパティ初期化の方法を指定します。コンストラクター関数を指定しない場合,作成時に的名字
、描述
,および类型
の各プロパティは[]
で初期化され,層の入力および出力の数は1に設定されます。
順方向関数の作成——予測時および学習時に層経由でデータを順方向にパス(順伝播)する方法を指定します。
逆方向関数の作成(オプション)——入力データおよび学習可能なパラメーターにおける損失の微分を指定します(逆伝播)。逆方向関数を指定しない場合,順方向関数は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%可学的参数%图层向后函数在这里。结束结束结束
まず,層に名前を付けます。クラスファイルの最初の行で,既存の名前myLayer
をresidualBlockLayer
に置き換えます。
classdefresidualBlockLayer < nnet.layer.Layer...结束
次に,コンストラクター関数myLayer
(方法
セクションの最初の関数)の名前を層と同じ名前に変更します。
方法函数layer = residualBlockLayer()…结束...结束
層のクラスファイルをresidualBlockLayer.m
という名前の新しいファイルに保存します。このファイル名は層の名前に一致しなければなりません。この層を使用するには,このファイルを現在のフォルダーまたはMATLABパス上のフォルダーに保存しなければなりません。
層のプロパティを属性
セクションで宣言し,学習可能なパラメーターを属性(可学的)
セクションにリストすることによって宣言します。
既定では,カスタム中間層には次のプロパティがあります。
财产 | 説明 |
---|---|
的名字 |
層の名前。文字ベクトルまたは字符串スカラーとして指定します。層グラフに層を含めるには,空ではない一意の層の名前を指定しなければなりません。この層が含まれる系列ネットワークに学習させて的名字 を'' に設定すると,学習時に層に名前が自動的に割り当てられます。 |
描述 |
層についての1行の説明。文字ベクトルまたは字符串スカラーとして指定します。この説明は,層が |
类型 |
層のタイプ。文字ベクトルまたは字符串スカラーとして指定します。类型 の値は,層が层 配列に表示されるときに表示されます。層のタイプを指定しない場合、層のクラス名が表示されます。 |
NumInputs |
層の入力の数。正の整数として指定します。この値を指定しない場合,NumInputs はInputNames の名前の数に自動的に設定されます。既定値は1です。 |
InputNames |
層の入力の名前。文字ベクトルの细胞配列として指定します。この値を指定せず,NumInputs が1より大きい場合,InputNames は{“三机”,…,“客栈”} に自動的に設定されます。ここで,N =NumInputs です。既定値は{'在'} です。 |
NumOutputs |
層の出力の数。正の整数として指定します。この値を指定しない場合,NumOutputs はOutputNames の名前の数に自動的に設定されます。既定値は1です。 |
OutputNames |
層の出力の名前。文字ベクトルの细胞配列として指定します。この値を指定せず,NumOutputs が1より大きい場合,OutputNames は{着干活,…,“outM”} に自動的に設定されます。ここで,米 =NumOutputs です。既定値は{“出”} です。 |
層にその他のプロパティがない場合は,属性
セクションを省略できます。
ヒント
複数の入力がある層を作成する場合,層のコンストラクターでNumInputs
とInputNames
のいずれかのプロパティを設定しなければなりません。複数の出力がある層を作成している場合,層のコンストラクターでNumOutputs
とOutputNames
のいずれかのプロパティを設定しなければなりません。例については,複数の入力があるカスタム深層学習層の定義を参照してください。
この残差ブロック層には追加のプロパティが必要ないため,属性
セクションは削除できます。
このカスタム層で唯一の学習可能なパラメーターは,dlnetwork
オブジェクトとして指定された残差ブロック自体です。この学習可能なパラメーターを属性(可学的)
セクションで宣言し,パラメーター网络
を呼び出します。
属性(可学的)%层可学习的参数%残块。网络结束
層を構築する関数を作成し,層のプロパティを初期化します。層を作成するために必要な変数をコンストラクター関数への入力として指定します。
残差ブロック層のコンストラクター関数には,入力引数が5つ必要です。
層の入力サイズ
畳み込みフィルターの数
ストライド(オプション。ストライドの既定値は1)
スキップ接続に畳み込み層を含めるためのフラグ(オプション。フラグの既定値は假
)
層の名前(オプション。既定の名前は''
)
コンストラクター関数residualBlockLayer
で,inputSize
とnumFilters
という名前をもつ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,…,Xn
はn
個の層入力,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);结束结束结束
層の順方向関数が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秒。
ここでは,関数で層に関する問題はまったく検出されていません。
setLearnRateFactor
|checkLayer
|setL2Factor
|getLearnRateFactor
|getL2Factor
|assembleNetwork