Main Content

dlnetwork

深層学習ニューラル ネットワーク

R2019b 以降

説明

dlnetwork オブジェクトは、深層学習ニューラル ネットワークのアーキテクチャを指定します。

ヒント

ほとんどの深層学習タスクでは、事前学習済みのニューラル ネットワークを使用して独自のデータに適応させることができます。転移学習を使用して、畳み込みニューラル ネットワークの再学習を行い、新しい一連のイメージを分類する方法を示す例については、Retrain Neural Network to Classify New Imagesを参照してください。または、関数 trainnet と関数 trainingOptions を使用してニューラル ネットワークを作成し、これにゼロから学習させることができます。

タスクに必要な学習オプションが関数 trainingOptions に用意されていない場合、自動微分を使用してカスタム学習ループを作成できます。詳細については、カスタム学習ループを使用したネットワークの学習を参照してください。

タスクに必要な損失関数が関数 trainnet に用意されていない場合、カスタム損失関数を関数ハンドルとして trainnet に指定できます。損失関数が予測とターゲットよりも多くの入力を必要とする場合 (たとえば、損失関数がニューラル ネットワークまたは追加の入力にアクセスする必要がある場合)、カスタム学習ループを使用してモデルに学習させます。詳細については、カスタム学習ループを使用したネットワークの学習を参照してください。

タスクに必要な層が Deep Learning Toolbox™ に用意されていない場合、カスタム層を作成できます。詳細については、カスタム深層学習層の定義を参照してください。層のネットワークとして指定できないモデルの場合は、モデルを関数として定義できます。詳細については、モデル関数を使用したネットワークの学習を参照してください。

どのタスクでどの学習手法を使用するかについての詳細は、MATLAB による深層学習モデルの学習を参照してください。

作成

説明

空のネットワーク

net = dlnetwork は、層がない dlnetwork オブジェクトを作成します。ニューラル ネットワークをゼロから作成するには、この構文を使用します。 (R2024a 以降)

入力層をもつネットワーク

net = dlnetwork(layers) は、指定された層を使用してニューラル ネットワークを作成し、未設定の学習可能なパラメーターと状態パラメーターを初期化します。この構文は、layers の入力層を使用して、ニューラル ネットワークの学習可能なパラメーターと状態パラメーターのサイズと形式を決定します。

layers が、完全な単入力ニューラル ネットワークを定義し、直列に配置された層をもち、入力層をもつ場合、この構文を使用します。

net = dlnetwork(layers,OutputNames=names) は、OutputNames プロパティも設定します。OutputNames プロパティは、ネットワークの出力に対応する層または層出力を指定します。

layers が、完全な単入力多出力ニューラル ネットワークを定義し、直列に配置された層をもち、入力層をもつ場合、この構文を使用します。

net = dlnetwork(layers,Initialize=tf) は、ニューラル ネットワークの学習可能なパラメーターと状態パラメーターを初期化するかどうかを指定します。tf1 (true) の場合、この構文は net = dlnetwork(layers) と等価です。tf0 (false) の場合、この構文は、空のネットワークを作成してから関数 addLayers を使用して layers を追加することと等価です。

未接続の入力をもつネットワーク

net = dlnetwork(layers,X1,...,XN) は、指定された層を使用してニューラル ネットワークを作成し、未設定の学習可能なパラメーターと状態パラメーターを初期化します。この構文は、ネットワークのデータ レイアウト オブジェクト、またはサンプル入力 X1,...,XN を使用して、ニューラル ネットワークの学習可能なパラメーターと状態値のサイズと形式を決定します。ここで、N はネットワーク入力の数です。

layers が、完全なニューラル ネットワークを定義し、直列に配置された層をもち、入力層に接続されていない入力をもつ場合、この構文を使用します。

net = dlnetwork(layers,X1,...,XN,OutputNames=names) は、OutputNames プロパティも設定します。

layers が、完全なニューラル ネットワークを定義し、複数の出力をもち、直列に配置された層をもち、入力層に接続されていない入力をもつ場合、この構文を使用します。

枝刈りが可能なネットワーク

net = dlnetwork(prunableNet) は、枝刈り用に選択されたフィルターを prunableNet の畳み込み層から削除して TaylorPrunableNetworkdlnetwork オブジェクトに変換し、圧縮された (学習可能なパラメーターを減らしてサイズを小さくした) dlnetwork オブジェクトを返します。

入力引数

すべて展開する

ネットワーク層。Layer 配列として指定します。

層は直列に結合されます。

サポートされている層の一覧については、深層学習層の一覧を参照してください。

学習可能なパラメーターと状態パラメーターのサイズと形式を決定するのに使用されるサンプル データまたはデータ レイアウト。形式を整えた dlarray オブジェクトまたは形式を整えた networkDataLayout オブジェクトとして指定します。ソフトウェアは、X1,...XN をネットワーク全体に伝播させて、dlnetwork オブジェクトの学習可能なパラメーターと状態パラメーターの適切なサイズと形式を決定し、未設定の学習可能なパラメーターと状態パラメーターがあれば、それを初期化します。

X1,...,XN の順序は、layers において入力を必要とする層の順序と一致しなければなりません。

メモ

自動的な初期化では、入力データのサイズと形式の情報のみが使用されます。入力データの値に基づいて初期化を行う場合、学習可能なパラメーターを手動で初期化しなければなりません。

学習可能なパラメーターと状態パラメーターを初期化するかどうかのフラグ。次のいずれかの値として指定します。

  • 1 (true) — 学習可能なパラメーターと状態パラメーターを初期化します。ソフトウェアは、layers の入力層を使用して、学習可能なパラメーターと状態パラメーターのサイズを決定します。

  • 0 (false) — 学習可能なパラメーターと状態パラメーターを初期化しません。次の場合にこのオプションを使用します。

    • ニューラル ネットワークをさらに編集する予定がある場合。層および接続の追加または削除を行う予定がある場合など。

    • カスタム層でネットワークを使用し、カスタム初期化関数を使用する場合。

ニューラル ネットワークにおける予測とカスタム学習ループでは、初期化されたネットワークが必要です。初期化されていないネットワークを初期化するには、関数 initialize を使用します。

1 次テイラー近似を使用した枝刈り用のネットワーク。TaylorPrunableNetwork オブジェクトとして指定します。

深層ニューラル ネットワークの枝刈りを行うには、Deep Learning Toolbox Model Quantization Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Quantization Library を参照してください。

プロパティ

すべて展開する

ネットワーク層。Layer 配列として指定します。

層の結合。2 列の table として指定します。

各 table 行はニューラル ネットワーク内の結合を表します。1 列目の Source は、各結合の結合元を指定します。2 列目の Destination は、各結合の結合先を指定します。結合元と結合先は層の名前であるか、"layerName/IOName" の形式を取ります。"IOName" は層の入力または出力の名前です。

データ型: table

ネットワークの学習可能パラメーター。3 列の table として指定します。

  • Layer — 層の名前。string スカラーとして指定します。

  • Parameter — パラメーター名。string スカラーとして指定します。

  • Value — パラメーターの値。dlarray オブジェクトとして指定します。

ネットワークの学習可能パラメーターには、ネットワークが学習した特徴が格納されます。たとえば、畳み込み層や全結合層の重みが格納されます。

学習可能なパラメーターの値に複素数値を使用できます。 (R2024a 以降)

データ型: table

ネットワークの状態。table として指定します。

ネットワークの状態は、次の 3 つの列をもつ table です。

  • Layer – 層の名前。string スカラーとして指定します。

  • Parameter – 状態パラメーターの名前。string スカラーとして指定します。

  • Value – 状態パラメーターの値。dlarray オブジェクトとして指定します。

層の状態には、層処理中に計算された情報が格納されます。この情報は、層の後続のフォワード パスで使用するために保持されます。たとえば、LSTM 層のセル状態と隠れ状態、またはバッチ正規化層の実行中の統計が格納されます。

LSTM 層などの再帰層の場合、HasStateInputs プロパティを 1 (true) に設定すると、その層の状態に関するエントリはステート テーブルに格納されません。

学習時または推論時に、関数 forward および関数 predict の出力を使用してネットワークの状態を更新できます。

状態値に複素数値を使用できます。 (R2024a 以降)

データ型: table

この プロパティ は読み取り専用です。

ネットワーク入力の名前。文字ベクトルの cell 配列として指定します。

ネットワーク入力は、入力層および層の未接続入力です。

入力層および 1 つの入力をもつ層の場合、入力の名前は層の名前です。複数の入力をもつ層の場合、入力の名前は "layerName/inputName" です。ここで、layerName は層の名前、inputName は層の入力の名前です。

データ型: cell

ネットワーク出力の名前。文字ベクトルの cell 配列として指定します。

1 つの出力をもつ層の場合、出力の名前は層の名前です。複数の出力をもつ層の場合、出力の名前は "layerName/outputName" です。ここで、layerName は層の名前、outputName は層の出力の名前です。

出力名を指定しない場合、ソフトウェアは、OutputNames プロパティを未接続の出力をもつ層に設定します。

関数 predict および関数 forward は、既定では OutputNames プロパティで指定された層によって出力されたデータを返します。

データ型: cell

この プロパティ は読み取り専用です。

ネットワークが初期化済みかどうかのフラグ。次のいずれかの値として指定します。

  • 1 (true) — ネットワークは初期化されており、予測およびカスタム学習ループに使用する準備ができています。学習可能パラメーターまたは状態パラメーターの "値" を変更しても、ネットワークは初期化済みのままになります。

  • 0 (false) — ネットワークは初期化されておらず、予測またはカスタム学習ループに使用する準備ができていません。初期化されていないネットワークを初期化するには、関数 initialize を使用します。

データ型: logical

オブジェクト関数

addInputLayerAdd input layer to network
addLayersニューラル ネットワークへの層の追加
removeLayersニューラル ネットワークからの層の削除
connectLayersニューラル ネットワークの層の結合
disconnectLayersニューラル ネットワークの層の切り離し
replaceLayerニューラル ネットワークの層の置き換え
getLayerLook up a layer by name or path
expandLayersExpand network layers
groupLayersGroup layers into network layers
summaryネットワークの概要の出力
plotニューラル ネットワーク アーキテクチャのプロット
initializedlnetwork の学習可能なパラメーターと状態パラメーターの初期化
predict推論用の深層学習ネットワーク出力の計算
forward学習用の深層学習ネットワーク出力の計算
resetStateニューラル ネットワークの状態パラメーターのリセット
setL2Factor層の学習可能なパラメーターの L2 正則化係数の設定
setLearnRateFactor層の学習可能なパラメーターの学習率係数を設定します。
getLearnRateFactor層の学習可能なパラメーターの学習率係数の取得
getL2Factor層の学習可能なパラメーターの L2 正則化係数の取得

すべて折りたたむ

入力として与えられた 2 次元イメージの categorical ラベルと数値を両方予測する 2 出力ニューラル ネットワークを定義します。

クラスと応答の数を指定します。

numClasses = 10;
numResponses = 1;

空のニューラル ネットワークを作成します。

net = dlnetwork;

ネットワークの主分岐の層、およびソフトマックス出力を定義します。

layers = [
    imageInputLayer([28 28 1],Normalization="none")

    convolution2dLayer(5,16,Padding="same")
    batchNormalizationLayer
    reluLayer(Name="relu_1")

    convolution2dLayer(3,32,Padding="same",Stride=2)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer

    additionLayer(2,Name="add")

    fullyConnectedLayer(numClasses)
    softmaxLayer(Name="softmax")];

net = addLayers(net,layers);

スキップ接続を追加します。

layers = [
    convolution2dLayer(1,32,Stride=2,Name="conv_skip")
    batchNormalizationLayer
    reluLayer(Name="relu_skip")];

net = addLayers(net,layers);
net = connectLayers(net,"relu_1","conv_skip");
net = connectLayers(net,"relu_skip","add/in2");

回帰出力用に全結合層を追加します。

layers = fullyConnectedLayer(numResponses,Name="fc_2");
net = addLayers(net,layers);
net = connectLayers(net,"add","fc_2");

ニューラル ネットワークをプロットで表示します。

figure
plot(net)

層が、完全な単入力ニューラル ネットワークを定義し、直列に配置された層をもち、入力層をもつ場合、層配列を dlnetwork オブジェクトに直接変換できます。

LSTM ネットワークを層配列として指定します。

layers = [
    sequenceInputLayer(12)
    lstmLayer(100)
    fullyConnectedLayer(9)
    softmaxLayer];

層配列を dlnetwork オブジェクトに変換します。この層配列は、入力層をもち、それ以外の入力をもたないため、ソフトウェアによってニューラル ネットワークが初期化されます。

net = dlnetwork(layers)
net = 
  dlnetwork with properties:

         Layers: [4x1 nnet.cnn.layer.Layer]
    Connections: [3x2 table]
     Learnables: [5x3 table]
          State: [2x3 table]
     InputNames: {'sequenceinput'}
    OutputNames: {'softmax'}
    Initialized: 1

  View summary with summary.

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

net = imagePretrainedNetwork;

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

learnables = net.Learnables;
head(learnables)
          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);
    
    net = setLearnRateFactor(net,layerName,parameterName,factor);
end

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

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

拡張機能

バージョン履歴

R2019b で導入

すべて展開する