Main Content

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

setLearnRateFactor

層の学習可能なパラメーターの学習率係数を設定します。

説明

layerUpdated = setLearnRateFactor(layer,parameterName,factor) は、layerparameterName という名前のパラメーターの学習率係数を factor に設定します。

組み込みの層の場合、対応するプロパティを使用して学習率係数を直接設定できます。たとえば、convolution2dLayer 層の場合、構文 layer = setLearnRateFactor(layer,'Weights',factor)layer.WeightLearnRateFactor = factor と等価です。

layerUpdated = setLearnRateFactor(layer,parameterPath,factor) は、パス parameterPath で指定されたパラメーターの学習率係数を設定します。この構文は、パラメーターがカスタム層の dlnetwork オブジェクトにあるときに使用します。

dlnetUpdated = setLearnRateFactor(dlnet,layerName,parameterName,factor) は、指定された dlnetwork オブジェクトの layerName という名前の層の parameterName という名前のパラメーターの学習率係数を設定します。

dlnetUpdated = setLearnRateFactor(dlnet,parameterPath,factor) は、パス parameterPath で指定されたパラメーターの学習率係数を設定します。この構文は、パラメーターが入れ子の層にあるときに使用します。

すべて折りたたむ

カスタム PReLU 層の学習可能なパラメーターの学習率係数を設定および取得します。

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

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

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

preluLayer の学習可能なパラメーター 'Alpha' の学習率係数を 2 に設定します。

layers(4) = setLearnRateFactor(layers(4),'Alpha',2);

更新された学習率係数を表示します。

factor = getLearnRateFactor(layers(4),'Alpha')
factor = 2

入れ子層の学習可能なパラメーターの学習率係数を設定して取得します。

この例にサポート ファイルとして添付されているカスタム層 residualBlockLayer を使用して、残差ブロック層を作成します。このファイルにアクセスするには、この例をライブ スクリプトとして開きます。

inputSize = [224 224 64];
numFilters = 64;
layer = residualBlockLayer(inputSize,numFilters)
layer = 
  residualBlockLayer with properties:

       Name: ''

   Learnable Parameters
    Network: [1x1 dlnetwork]

  Show all properties

入れ子ネットワークの層を表示します。

layer.Network.Layers
ans = 
  8x1 Layer array with layers:

     1   'in'      Image Input           224x224x64 images
     2   'conv1'   Convolution           64 3x3x64 convolutions with stride [1  1] and padding 'same'
     3   'gn1'     Group Normalization   Group normalization with 64 channels split into 1 groups
     4   'relu1'   ReLU                  ReLU
     5   'conv2'   Convolution           64 3x3x64 convolutions with stride [1  1] and padding 'same'
     6   'gn2'     Group Normalization   Group normalization with 64 channels split into 64 groups
     7   'add'     Addition              Element-wise addition of 2 inputs
     8   'relu2'   ReLU                  ReLU

関数 setLearnRateFactor を使用して、層 'conv1' の学習可能なパラメーター 'Weights' の学習率係数を 2 に設定します。

factor = 2;
layer = setLearnRateFactor(layer,'Network/conv1/Weights',factor);

関数 getLearnRateFactor を使用して、更新された学習率係数を取得します。

factor = getLearnRateFactor(layer,'Network/conv1/Weights')
factor = 2

dlnetwork オブジェクトの学習可能なパラメーターの学習率係数を設定して取得します。

dlnetwork オブジェクトを作成します。

layers = [
    imageInputLayer([28 28 1],'Normalization','none','Name','in')
    convolution2dLayer(5,20,'Name','conv')
    batchNormalizationLayer('Name','bn')
    reluLayer('Name','relu')
    fullyConnectedLayer(10,'Name','fc')
    softmaxLayer('Name','sm')];

lgraph = layerGraph(layers);

dlnet = dlnetwork(lgraph);

関数 setLearnRateFactor を使用して、畳み込み層の 'Weights' 学習可能パラメーターの学習率係数を 2 に設定します。

factor = 2;
dlnet = setLearnRateFactor(dlnet,'conv','Weights',factor);

関数 getLearnRateFactor を使用して、更新された学習率係数を取得します。

factor = getLearnRateFactor(dlnet,'conv','Weights')
factor = 2

dlnetwork オブジェクトの入れ子層の学習可能なパラメーターの学習率係数を設定して取得します。

この例にサポート ファイルとして添付されているカスタム層 residualBlockLayer を含む dlnetwork オブジェクトを作成します。このファイルにアクセスするには、この例をライブ スクリプトとして開きます。

inputSize = [224 224 3];
numFilters = 32;
numClasses = 5;

layers = [
    imageInputLayer(inputSize,'Normalization','none','Name','in')
    convolution2dLayer(7,numFilters,'Stride',2,'Padding','same','Name','conv')
    groupNormalizationLayer('all-channels','Name','gn')
    reluLayer('Name','relu')
    maxPooling2dLayer(3,'Stride',2,'Name','max')
    residualBlockLayer([56 56 numFilters],numFilters,'Name','res1')
    residualBlockLayer([56 56 numFilters],numFilters,'Name','res2')
    residualBlockLayer([56 56 numFilters],2*numFilters,'Stride',2,'IncludeSkipConvolution',true,'Name','res3')
    residualBlockLayer([28 28 2*numFilters],2*numFilters,'Name','res4')
    residualBlockLayer([28 28 2*numFilters],4*numFilters,'Stride',2,'IncludeSkipConvolution',true,'Name','res5')
    residualBlockLayer([14 14 4*numFilters],4*numFilters,'Name','res6')
    globalAveragePooling2dLayer('Name','gap')
    fullyConnectedLayer(numClasses,'Name','fc')
    softmaxLayer('Name','sm')];

lgraph = layerGraph(layers);
dlnet = dlnetwork(lgraph);

'res1' の入れ子ネットワークの層を表示します。

dlnet.Layers(6).Network.Layers
ans = 
  8x1 Layer array with layers:

     1   'in'      Image Input           56x56x32 images
     2   'conv1'   Convolution           32 3x3x32 convolutions with stride [1  1] and padding 'same'
     3   'gn1'     Group Normalization   Group normalization with 32 channels split into 1 groups
     4   'relu1'   ReLU                  ReLU
     5   'conv2'   Convolution           32 3x3x32 convolutions with stride [1  1] and padding 'same'
     6   'gn2'     Group Normalization   Group normalization with 32 channels split into 32 groups
     7   'add'     Addition              Element-wise addition of 2 inputs
     8   'relu2'   ReLU                  ReLU

関数 setLearnRateFactor を使用して、層 'conv1' の学習可能なパラメーター 'Weights' の学習率係数を 2 に設定します。

factor = 2;
dlnet = setLearnRateFactor(dlnet,'res1/Network/conv1/Weights',factor);

関数 getLearnRateFactor を使用して、更新された学習率係数を取得します。

factor = getLearnRateFactor(dlnet,'res1/Network/conv1/Weights')
factor = 2

事前学習済みのネットワークを読み込みます。

net = squeezenet;

ネットワークを層グラフに変換し、出力層を削除して、dlnetwork オブジェクトに変換します。

lgraph = layerGraph(net);
lgraph = removeLayers(lgraph,'ClassificationLayer_predictions');
dlnet = dlnetwork(lgraph);

dlnetwork オブジェクトの Learnables プロパティは、ネットワークの学習可能なパラメーターが格納された table です。この table には、入れ子層のパラメーターが別々の行に含まれています。このテーブル learnables の最初の数行を表示します。

learnables = dlnet.Learnables;
head(learnables)
ans=8×3 table
          Layer           Parameter           Value       
    __________________    _________    ___________________

    "conv1"               "Weights"    {3x3x3x64  dlarray}
    "conv1"               "Bias"       {1x1x64    dlarray}
    "fire2-squeeze1x1"    "Weights"    {1x1x64x16 dlarray}
    "fire2-squeeze1x1"    "Bias"       {1x1x16    dlarray}
    "fire2-expand1x1"     "Weights"    {1x1x16x64 dlarray}
    "fire2-expand1x1"     "Bias"       {1x1x64    dlarray}
    "fire2-expand3x3"     "Weights"    {3x3x16x64 dlarray}
    "fire2-expand3x3"     "Bias"       {1x1x64    dlarray}

ネットワークの学習可能なパラメーターを凍結するには、学習可能なパラメーターをループ処理し、関数 setLearnRateFactor を使用して学習率を 0 に設定します。

factor = 0;

numLearnables = size(learnables,1);
for i = 1:numLearnables
    layerName = learnables.Layer(i);
    parameterName = learnables.Parameter(i);
    
    dlnet = setLearnRateFactor(dlnet,layerName,parameterName,factor);
end

更新された学習率係数を学習時に使用するには、カスタム学習ループの更新関数に dlnetwork オブジェクトを渡さなければなりません。たとえば、次のコマンドを使用します。

[dlnet,velocity] = sgdmupdate(dlnet,gradients,velocity);

入力引数

すべて折りたたむ

入力層。スカラー Layer オブジェクトとして指定します。

パラメーター名。文字ベクトルまたは string スカラーとして指定します。

パラメーターの学習率係数。非負のスカラーとして指定します。

この係数にグローバル学習率が乗算されて、指定されたパラメーターの学習率が決定されます。たとえば、factor が 2 の場合、指定されたパラメーターの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、グローバル学習率が決定されます。

例: 2

入れ子層のパラメーターへのパス。string スカラーまたは文字ベクトルとして指定します。入れ子層は、それ自体が層グラフを学習可能なパラメーターとして定義するカスタム層です。

setLearnRateFactor への入力が入れ子層である場合、パラメーター パスは "propertyName/layerName/parameterName" の形式になります。ここで、

  • propertyName は、dlnetwork オブジェクトが格納されたプロパティの名前

  • layerName は、dlnetwork オブジェクト内の層の名前

  • parameterName は、パラメーターの名前

入れ子層のレベルが複数ある場合は、"propertyName1/layerName1/.../propertyNameN/layerNameN/parameterName" の形式で各レベルを指定します。ここで、propertyName1layerName1 が関数 setLearnRateFactor に対する入力の層に対応し、後続の部分がさらに深層のレベルに対応します。

例: setLearnRateFactor に対する層入力では、パス "Network/conv1/Weights" は、layer.Network によって指定された dlnetwork オブジェクト内の "conv1" という名前の層の "Weights" パラメーターを指定します。

setLearnRateFactor に対する入力が dlnetwork オブジェクトであり、目的のパラメーターが入れ子層の中にある場合、パラメーター パスは "layerName1/propertyName/layerName/parameterName" の形式になります。ここで、

  • layerName1 は、入力 dlnetwork オブジェクト内の層の名前

  • propertyName は、dlnetwork オブジェクトが格納された層のプロパティ

  • layerName は、dlnetwork オブジェクト内の層の名前

  • parameterName は、パラメーターの名前

入れ子層のレベルが複数ある場合は、"layerName1/propertyName1/.../layerNameN/propertyNameN/layerName/parameterName" の形式で各レベルを指定します。ここで、layerName1propertyName1 が関数 setLearnRateFactor に対する入力の層に対応し、後続の部分がさらに深層のレベルに対応します。

例: setLearnRateFactor に対する dlnetwork 入力では、パス "res1/Network/conv1/Weights" は、layer.Network によって指定された dlnetwork オブジェクト内の "conv1" という名前の層の "Weights" パラメーターを指定します。ここで layer は入力ネットワーク dlnet"res1" という名前の層です。

データ型: char | string

カスタム学習ループのネットワーク。dlnetwork オブジェクトとして指定します。

層の名前。string スカラーまたは文字ベクトルとして指定します。

データ型: char | string

出力引数

すべて折りたたむ

更新された層。Layer として返されます。

更新されたネットワーク。dlnetwork として返されます。

R2017b で導入