lstmLayer
再帰型ニューラル ネットワーク (RNN) 用の長短期記憶 (LSTM) 層
説明
LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習する RNN 層です。
この層により交互作用が付加され、学習中の長いシーケンスでの勾配フローの改善に役立ちます。
作成
説明
は、LSTM 層を作成し、layer
= lstmLayer(numHiddenUnits
)NumHiddenUnits
プロパティを設定します。
は、1 つ以上の名前と値の引数を使用して、追加の layer
= lstmLayer(numHiddenUnits
,Name=Value
)OutputMode
、活性化、状態、パラメーターと初期化、学習率および正則化、および Name
の各プロパティを設定します。
プロパティ
LSTM
NumHiddenUnits
— 隠れユニットの数
正の整数
隠れユニットの数 (隠れサイズとも呼ばれる)。正の整数として指定します。
隠れユニットの数は、タイム ステップ間に層によって記憶された情報 (隠れ状態) の量に相当します。隠れ状態には、シーケンス長に関係なく、以前のすべてのタイム ステップからの情報を含めることができます。隠れユニットの数が大きすぎる場合、層が学習データに対して過適合する可能性があります。隠れ状態によって、1 回の反復の間に層で処理されるタイム ステップ数が制限されることはありません。
この層は、NumHiddenUnits
個のチャネルをもつデータを出力します。
LSTMLayer
オブジェクトを作成する場合、このプロパティを設定するには、引数 numHiddenUnits
を使用します。LSTMLayer
オブジェクトの作成後、このプロパティは読み取り専用になります。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
OutputMode
— 出力モード
"sequence"
(既定値) | "last"
出力モード。次のいずれかの値として指定します。
"sequence"
— シーケンス全体を出力します。"last"
— シーケンスの最後のタイム ステップを出力します。
LSTMLayer
オブジェクトは、このプロパティを文字ベクトルとして格納します。
LSTMLayer
オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。LSTMLayer
オブジェクトの作成後、このプロパティは読み取り専用になります。
HasStateInputs
— 層への状態入力のフラグ
0
(false
) (既定値) | 1
(true
)
この プロパティ は読み取り専用です。
層への状態入力のフラグ。0
(false
) または 1
(true
) として指定します。
HasStateInputs
プロパティが 0
(false
) の場合、層は、入力データに対応する "in"
という名前の 1 つの入力をもちます。この場合、層は HiddenState
プロパティと CellState
プロパティを使用して層処理を行います。
HasStateInputs
プロパティが 1
(true
) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in"
、"hidden"
、および "cell"
という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs
が 1
(true
) の場合、HiddenState
プロパティと CellState
プロパティは空でなければなりません。
HasStateOutputs
— 層からの状態出力のフラグ
0
(false
) (既定値) | 1
(true
)
この プロパティ は読み取り専用です。
層からの状態出力のフラグ。0
(false
) または 1
(true
) として指定します。
HasStateOutputs
プロパティが 0
(false
) の場合、層は、出力データに対応する "out"
という名前の 1 つの出力をもちます。
HasStateOutputs
プロパティが 1
(true
) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out"
、"hidden"
、および "cell"
という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。
InputSize
— 入力サイズ
"auto"
(既定値) | 正の整数
この プロパティ は読み取り専用です。
入力サイズ。正の整数または "auto"
として指定します。InputSize
が "auto"
の場合、学習時に入力サイズが自動的に割り当てられます。
InputSize
が "auto"
の場合、LSTMLayer
オブジェクトは、このプロパティを文字ベクトルとして格納します。
データ型: double
| char
| string
活性化
StateActivationFunction
— セル状態と隠れ状態を更新する活性化関数
"tanh"
(既定値) | "softsign"
| "relu"
(R2024a 以降)
この プロパティ は読み取り専用です。
セル状態と隠れ状態を更新する活性化関数。次のいずれかの値として指定します。
"tanh"
— 双曲線正接関数 (tanh) を使用します。"softsign"
— ソフトサイン関数 を使用します。"relu"
(R2024a 以降) — 正規化線形ユニット (ReLU) 関数 を使用します。
ソフトウェアは、セル状態と隠れ状態を更新する計算における関数 としてこのオプションを使用します。
LSTM 層が活性化関数をどのように使用するかの詳細については、長短期記憶層を参照してください。
LSTMLayer
オブジェクトは、このプロパティを文字ベクトルとして格納します。
GateActivationFunction
— ゲートに適用する活性化関数
"sigmoid"
(既定値) | "hard-sigmoid"
ゲートに適用する活性化関数。次のいずれかの値として指定します。
"sigmoid"
— シグモイド関数 を使用します。"hard-sigmoid"
— ハード シグモイド関数を使用します。
ソフトウェアは、層のゲートの計算における関数 としてこのオプションを使用します。
LSTMLayer
オブジェクトは、このプロパティを文字ベクトルとして格納します。
LSTMLayer
オブジェクトを作成する場合、このプロパティを設定するには、対応する名前と値の引数を使用します。LSTMLayer
オブジェクトの作成後、このプロパティは読み取り専用になります。
状態
CellState
— セル状態
[]
(既定値) | 数値ベクトル
層処理で使用されるセル状態。NumHiddenUnits
行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときのセル状態の初期値に対応します。
このプロパティを手動で設定した後に関数 resetState
を呼び出すと、セル状態がこの値に設定されます。
HasStateInputs
が 1
(true
) の場合、CellState
プロパティは空でなければなりません。
データ型: single
| double
HiddenState
— 隠れ状態
[]
(既定値) | 数値ベクトル
層処理で使用される隠れ状態。NumHiddenUnits
行 1 列の数値ベクトルとして指定します。この値は、データが層に渡されるときの隠れ状態の初期値に対応します。
このプロパティを手動で設定した後に関数 resetState
を呼び出すと、隠れ状態がこの値に設定されます。
HasStateInputs
が 1
(true
) の場合、HiddenState
プロパティは空でなければなりません。
データ型: single
| double
パラメーターと初期化
InputWeightsInitializer
— 入力の重みを初期化する関数
"glorot"
(既定値) | "he"
| "orthogonal"
| "narrow-normal"
| "zeros"
| "ones"
| 関数ハンドル
入力の重みを初期化する関数。次のいずれかに指定します。
"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
RecurrentWeightsInitializer
— 再帰重みを初期化する関数
"orthogonal"
(既定値) | "glorot"
| "he"
| "narrow-normal"
| "zeros"
| "ones"
| 関数ハンドル
再帰重みを初期化する関数。次のいずれかに指定します。
"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
BiasInitializer
— バイアスを初期化する関数
"unit-forget-gate"
(既定値) | "narrow-normal"
| "ones"
| 関数ハンドル
バイアスを初期化する関数。次のいずれかの値として指定します。
"unit-forget-gate"
— 忘却ゲート バイアスを 1 で初期化し、残りのバイアスを 0 で初期化します。"narrow-normal"
— 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。"ones"
— 1 でバイアスを初期化します。関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は
bias = func(sz)
という形式でなければなりません。ここで、sz
はバイアスのサイズです。
この層では、Bias
プロパティが空の場合にのみバイアスが初期化されます。
LSTMLayer
オブジェクトは、このプロパティを文字ベクトルまたは関数ハンドルとして格納します。
データ型: char
| string
| function_handle
InputWeights
— 入力重み
[]
(既定値) | 行列
入力の重み。行列として指定します。
この入力重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの入力重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。
入力ゲート
忘却ゲート
セル候補
出力ゲート
入力の重みは学習可能なパラメーターです。関数 trainnet
を使用してニューラル ネットワークに学習させるとき、InputWeights
が空でない場合、ソフトウェアは InputWeights
プロパティを初期値として使用します。InputWeights
が空の場合、InputWeightsInitializer
によって指定された初期化子が使用されます。
学習時、InputWeights
は 4*NumHiddenUnits
行 InputSize
列の行列です。
RecurrentWeights
— 再帰重み
[]
(既定値) | 行列
再帰重み。行列として指定します。
この再帰重み行列は、LSTM 層にあるコンポーネント (ゲート) の 4 つの再帰重み行列の連結です。4 つの行列は、以下の順で垂直に連結されています。
入力ゲート
忘却ゲート
セル候補
出力ゲート
再帰重みは学習可能なパラメーターです。関数 trainnet
を使用して RNN に学習させるとき、RecurrentWeights
が空でない場合、ソフトウェアは RecurrentWeights
プロパティを初期値として使用します。RecurrentWeights
が空の場合、RecurrentWeightsInitializer
によって指定された初期化子が使用されます。
学習時、RecurrentWeights
は 4*NumHiddenUnits
行 NumHiddenUnits
列の行列です。
Bias
— 層のバイアス
[]
(既定値) | 数値ベクトル
層のバイアス。数値ベクトルとして指定します。
このバイアス ベクトルは、層にあるコンポーネント (ゲート) の 4 つのバイアス ベクトルの連結です。この層は、4 つのベクトルを次の順序で垂直に連結します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
層のバイアスは学習可能なパラメーターです。ニューラル ネットワークに学習させるときに、Bias
が空でない場合、trainnet
関数は Bias
プロパティを初期値として使用します。Bias
が空の場合、ソフトウェアは BiasInitializer
によって指定された初期化子を使用します。
学習時、Bias
は 4*NumHiddenUnits
行 1 列の数値ベクトルです。
学習率および正則化
InputWeightsLearnRateFactor
— 入力の重みの学習率係数
1
(既定値) | 非負のスカラー | 1 行 4 列の数値ベクトル
入力の重みの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル学習率が乗算されて、層の入力の重みの学習率係数が決定されます。たとえば、InputWeightsLearnRateFactor
が 2
の場合、層の入力の重みの学習率係数は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
InputWeights
に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsLearnRateFactor
のエントリは、以下のコンポーネントの学習率係数に対応します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例: [1 2 1 1]
RecurrentWeightsLearnRateFactor
— 再帰重みの学習率係数
1
(既定値) | 非負のスカラー | 1 行 4 列の数値ベクトル
再帰重みの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル学習率が乗算されて、層の再帰重みの学習率が決定されます。たとえば、RecurrentWeightsLearnRateFactor
が 2
の場合、層の再帰重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
RecurrentWeights
に含まれる 4 つの個々の行列について学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsLearnRateFactor
のエントリは、以下のコンポーネントの学習率係数に対応します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例: [1 2 1 1]
BiasLearnRateFactor
— バイアスの学習率係数
1
(既定値) | 非負のスカラー | 1 行 4 列の数値ベクトル
バイアスの学習率係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor
が 2
の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
Bias
に含まれる 4 つの個々のベクトルについて学習率係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasLearnRateFactor
のエントリは、以下のコンポーネントの学習率係数に対応します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。
例: 2
例: [1 2 1 1]
InputWeightsL2Factor
— 入力の重みの L2 正則化係数
1
(既定値) | 非負のスカラー | 1 行 4 列の数値ベクトル
入力の重みの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、層の入力の重みの L2 正則化係数が決定されます。たとえば、InputWeightsL2Factor
が 2
の場合、層の入力の重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、L2 正則化係数が決定されます。
InputWeights
に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。InputWeightsL2Factor
のエントリは、以下のコンポーネントの L2 正則化係数に対応します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例: [1 2 1 1]
RecurrentWeightsL2Factor
— 再帰重みの L2 正則化係数
1
(既定値) | 非負のスカラー | 1 行 4 列の数値ベクトル
再帰重みの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、層の再帰重みの L2 正則化係数が決定されます。たとえば、RecurrentWeightsL2Factor
が 2
の場合、層の再帰重みの L2 正則化係数は現在のグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、L2 正則化係数が決定されます。
RecurrentWeights
に含まれる 4 つの個々の行列の L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。RecurrentWeightsL2Factor
のエントリは、以下のコンポーネントの L2 正則化係数に対応します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
すべての行列に同じ値を指定するには、非負のスカラーを指定します。
例: 2
例: [1 2 1 1]
BiasL2Factor
— バイアスの L2 正則化係数
0
(既定値) | 非負のスカラー | 1 行 4 列の数値ベクトル
バイアスの L2 正則化係数。非負のスカラーまたは 1 行 4 列の数値ベクトルとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor
が 2
の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。
Bias
に含まれる 4 つの個々のベクトルの L2 正則化係数の値を制御するには、1 行 4 列のベクトルを指定します。BiasL2Factor
のエントリは、以下のコンポーネントの L2 正則化係数に対応します。
入力ゲート
忘却ゲート
セル候補
出力ゲート
すべてのベクトルに同じ値を指定するには、非負のスカラーを指定します。
例: 2
例: [1 2 1 1]
層
NumInputs
— 入力の数
1
| 3
この プロパティ は読み取り専用です。
層への入力の数。
HasStateInputs
プロパティが 0
(false
) の場合、層は、入力データに対応する "in"
という名前の 1 つの入力をもちます。この場合、層は HiddenState
プロパティと CellState
プロパティを使用して層処理を行います。
HasStateInputs
プロパティが 1
(true
) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in"
、"hidden"
、および "cell"
という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs
が 1
(true
) の場合、HiddenState
プロパティと CellState
プロパティは空でなければなりません。
データ型: double
InputNames
— 入力名
"in"
| ["in" "hidden" "cell"]
この プロパティ は読み取り専用です。
層の入力名。
HasStateInputs
プロパティが 0
(false
) の場合、層は、入力データに対応する "in"
という名前の 1 つの入力をもちます。この場合、層は HiddenState
プロパティと CellState
プロパティを使用して層処理を行います。
HasStateInputs
プロパティが 1
(true
) の場合、層は、それぞれ入力データ、隠れ状態、およびセル状態に対応する "in"
、"hidden"
、および "cell"
という名前の 3 つの入力をもちます。この場合、層はこれらの入力に渡された値を使用して層処理を行います。HasStateInputs
が 1
(true
) の場合、HiddenState
プロパティと CellState
プロパティは空でなければなりません。
LSTMLayer
オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。
NumOutputs
— 出力の数
1
| 3
この プロパティ は読み取り専用です。
層への出力の数。
HasStateOutputs
プロパティが 0
(false
) の場合、層は、出力データに対応する "out"
という名前の 1 つの出力をもちます。
HasStateOutputs
プロパティが 1
(true
) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out"
、"hidden"
、および "cell"
という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。
データ型: double
OutputNames
— 出力名
"out"
| ["out" "hidden" "cell"]
この プロパティ は読み取り専用です。
層の出力名。
HasStateOutputs
プロパティが 0
(false
) の場合、層は、出力データに対応する "out"
という名前の 1 つの出力をもちます。
HasStateOutputs
プロパティが 1
(true
) の場合、層は、それぞれ出力データ、隠れ状態、およびセル状態に対応する "out"
、"hidden"
、および "cell"
という名前の 3 つの出力をもちます。この場合、層は、計算した状態値も出力します。
LSTMLayer
オブジェクトは、このプロパティを文字ベクトルの cell 配列として格納します。
例
LSTM 層の作成
名前が "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
はシーケンスの数です。各シーケンスは numTimeSteps
行 numChannels
列の数値配列です。ここで、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)
分類用の LSTM ネットワーク
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];
回帰用の LSTM ネットワーク
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 回帰を参照してください。
深い LSTM ネットワーク
出力モードが "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];
アルゴリズム
長短期記憶層
LSTM 層は、時系列データおよびシーケンス データのタイム ステップ間の長期的な依存関係を学習する RNN 層です。
層の状態は、"隠れ状態" ("出力状態" とも呼ばれる) および "セル状態" で構成されています。タイム ステップ t の隠れ状態には、このタイム ステップの LSTM 層の出力が含まれています。セル状態には、前のタイム ステップで学習した情報が含まれています。各タイム ステップで、層では情報をセル状態に追加したり、セル状態から削除したりします。その際、層では "ゲート" を使用して、これらの更新を制御します。
以下のコンポーネントは、層のセル状態および隠れ状態を制御します。
コンポーネント | 目的 |
---|---|
入力ゲート (i) | セル状態の更新レベルを制御 |
忘却ゲート (f) | セル状態のリセット (忘却) レベルを制御 |
セル候補 (g) | セル状態に情報を追加 |
出力ゲート (o) | 隠れ状態に追加されるセル状態のレベルを制御 |
次の図は、タイム ステップ t でのデータのフローを示しています。この図は、ゲートがセル状態や隠れ状態をどのように忘却、更新、および出力するかを示しています。
LSTM 層の学習可能な重みは、入力の重み W (InputWeights
)、再帰重み R (RecurrentWeights
)、およびバイアス b (Bias
) です。行列 W、R、および b はそれぞれ、各コンポーネントの入力の重み、再帰重み、およびバイアスの連結です。この層は、次の方程式に従って行列を連結します。
ここで、i、f、g、および o はそれぞれ、入力ゲート、忘却ゲート、セル候補、および出力ゲートを表します。
タイム ステップ t でのセル状態は次で与えられます。
ここで、 はアダマール積 (ベクトルの要素単位の乗算) を表します。
タイム ステップ t での隠れ状態は次で与えられます。
ここで、 は状態活性化関数を表します。既定では、関数 lstmLayer
は双曲線正接関数 (tanh) を使用して状態活性化関数を計算します。
次の式は、タイム ステップ t におけるコンポーネントを表しています。
コンポーネント | 式 |
---|---|
入力ゲート | |
忘却ゲート | |
セル候補 | |
出力ゲート |
これらの計算では、 はゲート活性化関数を表します。既定では、関数 lstmLayer
は で与えられるシグモイド関数を使用して、ゲート活性化関数を計算します。
層の入力形式と出力形式
層配列内または層グラフ内の層は、形式を整えた dlarray
オブジェクトとして後続の層にデータを渡します。dlarray
オブジェクトの形式は文字列で、各文字はデータ内の対応する次元を表します。この形式には次の文字が 1 つ以上含まれています。
"S"
— 空間"C"
— チャネル"B"
— バッチ"T"
— 時間"U"
— 指定なし
たとえば、4 次元配列として表された 2 次元イメージ データがあり、最初の 2 つの次元がイメージの空間次元に対応し、3 番目の次元がイメージのチャネルに対応し、4 番目の次元がバッチ次元に対応している場合、このイメージ データは "SSCB"
(空間、空間、チャネル、バッチ) という形式で記述できます。
functionLayer
オブジェクトを使用するか、関数 forward
と関数 predict
を dlnetwork
オブジェクトと共に使用して、カスタム層の開発などの自動微分ワークフローで、これらの dlarray
オブジェクトを操作できます。
次の表は、LSTMLayer
オブジェクトでサポートされている入力形式、および対応する出力形式を示しています。ソフトウェアが nnet.layer.Formattable
クラスを継承していないカスタム層、または Formattable
プロパティが 0
(false
) に設定された FunctionLayer
オブジェクトに層の出力を渡す場合、その層は形式を整えていない dlarray
オブジェクトを受け取り、この表に示された形式に従って次元が並べられます。ここには一部の形式のみを示します。層では、追加の "S"
(空間) 次元または "U"
(未指定) 次元をもつ形式など、追加の形式がサポートされている場合があります。
入力形式 | OutputMode | 出力形式 |
---|---|---|
| "sequence" |
|
"last" | ||
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
dlnetwork
オブジェクトでは、LSTMLayer
オブジェクトもこれらの入力形式と出力形式の組み合わせをサポートします。
入力形式 | OutputMode | 出力形式 |
---|---|---|
| "sequence" |
|
"last" | ||
| "sequence" | |
"last" | ||
| "sequence" | |
"last" | ||
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" | ||
| "sequence" | |
"last" | ||
| "sequence" | |
"last" | ||
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" | ||
| "sequence" | |
"last" | ||
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
| |
| "sequence" |
|
"last" |
|
HasStateInputs
プロパティが 1
(true
) の場合、それぞれ隠れ状態とセル状態に対応する "hidden"
および "cell"
という名前の 2 つの入力が層に追加されます。これらの追加の入力は、"CB"
(channel、batch) という入力形式を想定しています。
HasStateOutputs
プロパティが 1
(true
) の場合、それぞれ隠れ状態とセル状態に対応する "hidden"
および "cell"
という名前の 2 つの出力が層に追加されます。これらの追加の出力は、"CB"
(channel、batch) という出力形式をもちます。
参照
[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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
コード生成では、指定なし (U) の次元をもつ
dlarray
オブジェクトをこの層に渡すことはサポートされていません。一般的なコード生成では、
HasStateInputs
プロパティとHasStateOutputs
プロパティを0
(false) に設定しなければなりません。コード生成では、この層への入力として、チャネル (C) の次元をもつ
dlarray
オブジェクトを渡さなければなりません。たとえば、コード生成では "SSC" や "SSCBT" などのデータ形式がサポートされます。Intel® MKL-DNN または ARM® Compute Library を使用してコードを生成する場合、以下のようになります。
StateActivationFunction
プロパティを"tanh"
に設定しなければなりません。GateActivationFunction
プロパティを"sigmoid"
に設定しなければなりません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意および制限:
コード生成では、指定なし (U) の次元をもつ
dlarray
オブジェクトをこの層に渡すことはサポートされていません。コード生成では、この層への入力として、チャネル (C) の次元をもつ
dlarray
オブジェクトを渡さなければなりません。たとえば、コード生成では "SSC" や "SSCBT" などのデータ形式がサポートされます。HasStateInputs
プロパティとHasStateOutputs
プロパティを0
(false
) に設定しなければなりません。NVIDIA® TensorRT または CUDA 深層ニューラル ネットワーク ライブラリ (cuDNN) コンピューティング ライブラリを使用してコードを生成する場合:
StateActivationFunction
プロパティを"tanh"
に設定しなければなりません。GateActivationFunction
プロパティを"sigmoid"
に設定しなければなりません。
バージョン履歴
R2017b で導入R2024a: ReLU 状態活性化関数
ReLU 状態活性化関数を指定するには、StateActivationFunction
プロパティを "relu"
に設定します。
R2019a: 既定の入力の重みの初期化は Glorot
R2019a 以降では、既定で、Glorot 初期化子を使用してこの層の入力の重みが初期化されます。この動作は、学習を安定化させるのに役立ち、通常は深層ニューラル ネットワークの学習時間を短縮します。
以前のリリースでは、既定で、平均 0、分散 0.01 の正規分布からサンプリングを行って、層の入力の重みが初期化されます。この動作を再現するには、層の InputWeightsInitializer
オプションを "narrow-normal"
に設定します。
R2019a: 既定の再帰重みの初期化は直交
R2019a 以降では、既定で、直交行列 Q を使用してこの層の再帰重みが初期化されます。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。この動作は、学習を安定化させるのに役立ち、通常は深層ニューラル ネットワークの学習時間を短縮します。
以前のリリースでは、既定で、平均 0、分散 0.01 の正規分布からサンプリングを行って、層の再帰重みが初期化されます。この動作を再現するには、層の RecurrentWeightsInitializer
オプションを "narrow-normal"
に設定します。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)