Main Content

lstmLayer

再帰型ニューラル ネットワーク (RNN) 用の長短期記憶 (LSTM) 層

説明

LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習する RNN 層です。

この層により交互作用が付加され、学習中の長いシーケンスでの勾配フローの改善に役立ちます。

作成

説明

layer = lstmLayer(numHiddenUnits) は、LSTM 層を作成し、NumHiddenUnits プロパティを設定します。

layer = lstmLayer(numHiddenUnits,Name=Value) は、1 つ以上の名前と値の引数を使用して、追加の OutputMode活性化状態パラメーターと初期化学習率および正則化、および Name の各プロパティを設定します。

プロパティ

すべて展開する

LSTM

隠れユニットの数 (隠れサイズとも呼ばれる)。正の整数として指定します。

隠れユニットの数は、タイム ステップ間に層によって記憶された情報 (隠れ状態) の量に相当します。隠れ状態には、シーケンス長に関係なく、以前のすべてのタイム ステップからの情報を含めることができます。隠れユニットの数が大きすぎる場合、層が学習データに対して過適合する可能性があります。隠れ状態によって、1 回の反復の間に層で処理されるタイム ステップ数が制限されることはありません。

この層は、NumHiddenUnits 個のチャネルをもつデータを出力します。

LSTMLayer オブジェクトを作成する場合、このプロパティを設定するには、引数 numHiddenUnits を使用します。LSTMLayer オブジェクトの作成後、このプロパティは読み取り専用になります。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

出力モード。次のいずれかの値として指定します。

  • "sequence" — シーケンス全体を出力します。

  • "last" — シーケンスの最後のタイム ステップを出力します。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

LSTMLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。LSTMLayer オブジェクトの作成後、このプロパティは読み取り専用になります。

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

層への状態入力のフラグ。0 (false) または 1 (true) として指定します。

HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティと CellState プロパティを使用して層処理を行います。

HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in""hidden"、および "cell" という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs1 (true) の場合、HiddenState プロパティと CellState プロパティは空でなければなりません。

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

層からの状態出力のフラグ。0 (false) または 1 (true) として指定します。

HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out""hidden"、および "cell" という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。

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

入力サイズ。正の整数または "auto" として指定します。InputSize"auto" の場合、学習時に入力サイズが自動的に割り当てられます。

InputSize"auto" の場合、LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

データ型: double | char | string

活性化

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

セル状態と隠れ状態を更新する活性化関数。次のいずれかの値として指定します。

  • "tanh" — 双曲線正接関数 (tanh) を使用します。

  • "softsign" — ソフトサイン関数 softsign(x)=x1+|x| を使用します。

  • "relu" (R2024a 以降) — 正規化線形ユニット (ReLU) 関数 ReLU(x)={x,x>00,x0 を使用します。

ソフトウェアは、セル状態と隠れ状態を更新する計算における関数 σc としてこのオプションを使用します。

LSTM 層が活性化関数をどのように使用するかの詳細については、長短期記憶層を参照してください。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

ゲートに適用する活性化関数。次のいずれかの値として指定します。

  • "sigmoid" — シグモイド関数 σ(x)=(1+ex)1 を使用します。

  • "hard-sigmoid" — ハード シグモイド関数を使用します。

    σ(x)={00.2x+0.51if x<2.5if2.5x2.5if x>2.5.

ソフトウェアは、層のゲートの計算における関数 σg としてこのオプションを使用します。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

LSTMLayer オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。LSTMLayer オブジェクトの作成後、このプロパティは読み取り専用になります。

状態

層処理で使用されるセル状態。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときのセル状態の初期値に対応します。

このプロパティを手動で設定した後に関数 resetState を呼び出すと、セル状態がこの値に設定されます。

HasStateInputs1 (true) の場合、CellState プロパティは空でなければなりません。

データ型: single | double

層処理で使用される隠れ状態。NumHiddenUnits 行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときの隠れ状態の初期値に対応します。

このプロパティを手動で設定した後に関数 resetState を呼び出すと、隠れ状態がこの値に設定されます。

HasStateInputs1 (true) の場合、HiddenState プロパティは空でなければなりません。

データ型: single | double

パラメーターと初期化

入力の重みを初期化する関数。次のいずれかに指定します。

  • "glorot" – Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して入力の重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(InputSize + numOut) の一様分布から個別にサンプリングを行います。ここで、numOut = 4*NumHiddenUnits です。

  • "he" – He 初期化子[3]を使用して入力の重みを初期化します。He 初期化子は、平均 0、分散 2/InputSize の正規分布からサンプリングを行います。

  • "orthogonal" – 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。[4]

  • "narrow-normal" – 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、入力の重みを初期化します。

  • "zeros" – 0 で入力の重みを初期化します。

  • "ones" – 1 で入力の重みを初期化します。

  • 関数ハンドル – カスタム関数で入力の重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は入力の重みのサイズです。

この層では、InputWeights プロパティが空の場合にのみ入力の重みが初期化されます。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

データ型: char | string | function_handle

再帰重みを初期化する関数。次のいずれかに指定します。

  • "orthogonal" – 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。[4]

  • "glorot" – Glorot 初期化子[2] (Xavier 初期化子とも呼ばれる) を使用して再帰重みを初期化します。Glorot 初期化子は、平均 0、分散 2/(numIn + numOut) の一様分布から個別にサンプリングを行います。ここで、numIn = NumHiddenUnits および numOut = 4*NumHiddenUnits です。

  • "he" – He 初期化子[3]を使用して再帰重みを初期化します。He 初期化子は、平均 0、分散 2/NumHiddenUnits の正規分布からサンプリングを行います。

  • "narrow-normal" – 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、再帰重みを初期化します。

  • "zeros" – 0 で再帰重みを初期化します。

  • "ones" – 1 で再帰重みを初期化します。

  • 関数ハンドル – カスタム関数で再帰重みを初期化します。関数ハンドルを指定する場合、関数は weights = func(sz) という形式でなければなりません。ここで、sz は再帰重みのサイズです。

この層では、RecurrentWeights プロパティが空の場合にのみ再帰重みが初期化されます。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

データ型: char | string | function_handle

バイアスを初期化する関数。次のいずれかの値として指定します。

  • "unit-forget-gate" — 忘却ゲート バイアスを 1 で初期化し、残りのバイアスを 0 で初期化します。

  • "narrow-normal" — 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。

  • "ones" — 1 でバイアスを初期化します。

  • 関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は bias = func(sz) という形式でなければなりません。ここで、sz はバイアスのサイズです。

この層では、Bias プロパティが空の場合にのみバイアスが初期化されます。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。

データ型: char | string | function_handle

入力の重み。行列として指定します。

この入力重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの入力重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

入力の重みは学習可能なパラメーターです。関数 trainnet を使用してニューラル ネットワークに学習させるとき、InputWeights が空でない場合、ソフトウェアは InputWeights プロパティを初期値として使用します。InputWeights が空の場合、InputWeightsInitializer によって指定された初期化子が使用されます。

学習時、InputWeights4*NumHiddenUnitsInputSize 列の行列です。

再帰重み。行列として指定します。

この再帰重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの再帰重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

再帰重みは学習可能なパラメーターです。関数 trainnet を使用して RNN に学習させるとき、RecurrentWeights が空でない場合、ソフトウェアは RecurrentWeights プロパティを初期値として使用します。RecurrentWeights が空の場合、RecurrentWeightsInitializer によって指定された初期化子が使用されます。

学習時、RecurrentWeights4*NumHiddenUnitsNumHiddenUnits 列の行列です。

層のバイアス。数値ベクトルとして指定します。

このバイアス ベクトルは、層にあるコンポーネント (ゲート) の 4 つのバイアス ベクトルの連結です。この層は、4 つのベクトルを次の順序で垂直に連結します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

層のバイアスは学習可能なパラメーターです。ニューラル ネットワークに学習させるときに、Bias が空でない場合、trainnet 関数は Bias プロパティを初期値として使用します。Bias が空の場合、ソフトウェアは BiasInitializer によって指定された初期化子を使用します。

学習時、Bias4*NumHiddenUnits 行 1 列の数値ベクトルです。

学習率および正則化

入力の重みの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、層の入力の重みの学習率係数が決定されます。たとえば、InputWeightsLearnRateFactor2 の場合、層の入力の重みの学習率係数は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

InputWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsLearnRateFactor のエントリは、以下のコンポーネントの学習率係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

再帰重みの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル学習率が乗算されて、層の再帰重みの学習率が決定されます。たとえば、RecurrentWeightsLearnRateFactor2 の場合、層の再帰重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル学習率が決定されます。

RecurrentWeights に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsLearnRateFactor のエントリは、以下のコンポーネントの学習率係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

バイアスの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

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

Bias に含まれる 4 つの個々のベクトルについて学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasLearnRateFactor のエントリは、以下のコンポーネントの学習率係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

入力の重みの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、層の入力の重みの L2 正則化係数が決定されます。たとえば、InputWeightsL2Factor2 の場合、層の入力の重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、L2 正則化係数が決定されます。

InputWeights に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsL2Factor のエントリは、以下のコンポーネントの L2 正則化係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

再帰重みの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、層の再帰重みの L2 正則化係数が決定されます。たとえば、RecurrentWeightsL2Factor2 の場合、層の再帰重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、L2 正則化係数が決定されます。

RecurrentWeights に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsL2Factor のエントリは、以下のコンポーネントの L2 正則化係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

すべての行列に同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

バイアスの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。

この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor2 の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。

Bias に含まれる 4 つの個々のベクトルの L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasL2Factor のエントリは、以下のコンポーネントの L2 正則化係数に対応します。

  1. 入力ゲート

  2. 忘却ゲート

  3. セル候補

  4. 出力ゲート

すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。

例: 2

例: [1 2 1 1]

層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainnet および関数 dlnetwork は、名前が "" の層に自動的に名前を割り当てます。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルとして格納します。

データ型: char | string

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

層への入力の数。

HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティと CellState プロパティを使用して層処理を行います。

HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in""hidden"、および "cell" という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs1 (true) の場合、HiddenState プロパティと CellState プロパティは空でなければなりません。

データ型: double

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

層の入力名。

HasStateInputs プロパティが 0 (false) の場合、層は、入力データに対応する "in" という名前の 1 つの入力をもちます。この場合、層は HiddenState プロパティと CellState プロパティを使用して層処理を行います。

HasStateInputs プロパティが 1 (true) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in""hidden"、および "cell" という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs1 (true) の場合、HiddenState プロパティと CellState プロパティは空でなければなりません。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。

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

層への出力の数。

HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out""hidden"、および "cell" という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。

データ型: double

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

層の出力名。

HasStateOutputs プロパティが 0 (false) の場合、層は、出力データに対応する "out" という名前の 1 つの出力をもちます。

HasStateOutputs プロパティが 1 (true) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out""hidden"、および "cell" という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。

LSTMLayer オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。

すべて折りたたむ

名前が "lstm1" で、隠れユニットが 100 個の LSTM 層を作成します。

layer = lstmLayer(100,Name="lstm1")
layer = 
  LSTMLayer with properties:

                       Name: 'lstm1'
                 InputNames: {'in'}
                OutputNames: {'out'}
                  NumInputs: 1
                 NumOutputs: 1
             HasStateInputs: 0
            HasStateOutputs: 0

   Hyperparameters
                  InputSize: 'auto'
             NumHiddenUnits: 100
                 OutputMode: 'sequence'
    StateActivationFunction: 'tanh'
     GateActivationFunction: 'sigmoid'

   Learnable Parameters
               InputWeights: []
           RecurrentWeights: []
                       Bias: []

   State Parameters
                HiddenState: []
                  CellState: []

Use properties method to see a list of all properties.

Layer 配列に LSTM 層を含めます。

inputSize = 12;
numHiddenUnits = 100;
numClasses = 9;

layers = [ ...
    sequenceInputLayer(inputSize)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numClasses)
    softmaxLayer]
layers = 
  4x1 Layer array with layers:

     1   ''   Sequence Input    Sequence input with 12 dimensions
     2   ''   LSTM              LSTM with 100 hidden units
     3   ''   Fully Connected   9 fully connected layer
     4   ''   Softmax           softmax

sequence-to-label 分類について深層学習 LSTM ネットワークに学習をさせます。

サンプル データを WaveformData.mat から読み込みます。データは、numObservations 行 1 列のシーケンスの cell 配列です。ここで、numObservations はシーケンスの数です。各シーケンスは numTimeStepsnumChannels 列の数値配列です。ここで、numTimeSteps はシーケンスのタイム ステップ数、numChannels はシーケンスのチャネル数です。

load WaveformData

シーケンスの一部をプロットで可視化します。

numChannels = size(data{1},2);

idx = [3 4 5 12];
figure
tiledlayout(2,2)
for i = 1:4
    nexttile
    stackedplot(data{idx(i)},DisplayLabels="Channel "+string(1:numChannels))
    
    xlabel("Time Step")
    title("Class: " + string(labels(idx(i))))
end

クラス名を表示します。

classNames = categories(labels)
classNames = 4×1 cell
    {'Sawtooth'}
    {'Sine'    }
    {'Square'  }
    {'Triangle'}

テスト用のデータを確保します。データの 90% から成る学習セットとデータの残りの 10% から成るテスト セットにデータを分割します。データを分割するには、この例にサポート ファイルとして添付されている関数 trainingPartitions を使用します。このファイルにアクセスするには、例をライブ スクリプトとして開きます。

numObservations = numel(data);
[idxTrain,idxTest] = trainingPartitions(numObservations, [0.9 0.1]);
XTrain = data(idxTrain);
TTrain = labels(idxTrain);

XTest = data(idxTest);
TTest = labels(idxTest);

LSTM ネットワーク アーキテクチャを定義します。入力サイズを入力データのチャネルの数として指定します。120 個の隠れユニットを含み、シーケンスの最後の要素を出力するように LSTM 層を指定します。最後に、クラス数と一致する出力サイズをもつ全結合層を含め、その後にソフトマックス層を含めます。

numHiddenUnits = 120;
numClasses = numel(categories(TTrain));

layers = [ ...
    sequenceInputLayer(numChannels)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer]
layers = 
  4×1 Layer array with layers:

     1   ''   Sequence Input    Sequence input with 3 dimensions
     2   ''   LSTM              LSTM with 120 hidden units
     3   ''   Fully Connected   4 fully connected layer
     4   ''   Softmax           softmax

学習オプションを指定します。学習率 0.01、勾配しきい値 1 で Adam ソルバーを使用して学習させます。エポックの最大数を 200 に設定し、すべてのエポックでデータをシャッフルします。既定では、ソフトウェアは GPU が利用できる場合に GPU で学習を行います。GPU を使用するには、Parallel Computing Toolbox とサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

options = trainingOptions("adam", ...
    MaxEpochs=200, ...
    InitialLearnRate=0.01,...
    Shuffle="every-epoch", ...
    GradientThreshold=1, ...
    Verbose=false, ...
    Metrics="accuracy", ...
    Plots="training-progress");

関数trainnetを使用して LSTM ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。

net = trainnet(XTrain,TTrain,layers,"crossentropy",options);

テスト データを分類します。学習に使用されるサイズと同じミニバッチ サイズを指定します。

scores = minibatchpredict(net,XTest);
YTest = scores2label(scores,classNames);

予測の分類精度を計算します。

acc = mean(YTest == TTest)
acc = 0.8700

分類結果を混同チャートで表示します。

figure
confusionchart(TTest,YTest)

sequence-to-label 分類用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、全結合層、およびソフトマックス層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズをクラスの数に設定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード "last" を指定します。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

sequence-to-label 分類について LSTM ネットワークに学習をさせ、新しいデータを分類する方法の例については、深層学習を使用したシーケンスの分類を参照してください。

sequence-to-sequence 分類用の LSTM ネットワークを作成するには、sequence-to-label 分類の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを "sequence" に設定します。

numFeatures = 12;
numHiddenUnits = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="sequence")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

sequence-to-one 回帰用の LSTM ネットワークを作成するには、シーケンス入力層、LSTM 層、および全結合層を含む層配列を作成します。

シーケンス入力層のサイズを入力データの特徴の数に設定します。全結合層のサイズを応答の数に設定します。シーケンス長を指定する必要はありません。

LSTM 層では、隠れユニットの数と出力モード "last" を指定します。

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="last")
    fullyConnectedLayer(numResponses)];

sequence-to-sequence 回帰用の LSTM ネットワークを作成するには、sequence-to-one 回帰の場合と同じアーキテクチャを使用しますが、LSTM 層の出力モードを "sequence" に設定します。

numFeatures = 12;
numHiddenUnits = 125;
numResponses = 1;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,OutputMode="sequence")
    fullyConnectedLayer(numResponses)];

sequence-to-sequence 回帰について LSTM ネットワークに学習をさせて、新しいデータを予測する方法の例については、深層学習を使用した sequence-to-sequence 回帰を参照してください。

出力モードが "sequence" の追加の LSTM 層を LSTM 層の前に挿入すると、LSTM ネットワークを深くできます。過適合を防止するために、LSTM 層の後にドロップアウト層を挿入できます。

sequence-to-label 分類ネットワークでは、最後の LSTM 層の出力モードは "last" でなければなりません。

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,OutputMode="sequence")
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,OutputMode="last")
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer];

sequence-to-sequence 分類ネットワークでは、最後の LSTM 層の出力モードは "sequence" でなければなりません。

numFeatures = 12;
numHiddenUnits1 = 125;
numHiddenUnits2 = 100;
numClasses = 9;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits1,OutputMode="sequence")
    dropoutLayer(0.2)
    lstmLayer(numHiddenUnits2,OutputMode="sequence")
    dropoutLayer(0.2)
    fullyConnectedLayer(numClasses)
    softmaxLayer];

アルゴリズム

すべて展開する

参照

[1] Hochreiter, S, and J. Schmidhuber, 1997. Long short-term memory. Neural computation, 9(8), pp.1735–1780.

[2] Glorot, Xavier, and Yoshua Bengio. "Understanding the Difficulty of Training Deep Feedforward Neural Networks." In Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, 249–356. Sardinia, Italy: AISTATS, 2010. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

[3] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In 2015 IEEE International Conference on Computer Vision (ICCV), 1026–34. Santiago, Chile: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123

[4] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. "Exact Solutions to the Nonlinear Dynamics of Learning in Deep Linear Neural Networks.” Preprint, submitted February 19, 2014. https://arxiv.org/abs/1312.6120.

拡張機能

バージョン履歴

R2017b で導入

すべて展開する