Main Content

lstmLayer

RNN(순환 신경망)의 LSTM(장단기 기억) 계층

설명

LSTM 계층은 시계열 및 시퀀스 데이터에서 시간 스텝 간의 장기 종속성을 학습하는 RNN 계층입니다.

이 계층은 부가 상호 작용을 수행하는데, 이는 훈련 중에 긴 시퀀스에 대한 기울기 흐름을 개선하는 데 도움이 될 수 있습니다.

생성

설명

예제

layer = lstmLayer(numHiddenUnits)는 LSTM 계층을 만들고 NumHiddenUnits 속성을 설정합니다.

예제

layer = lstmLayer(numHiddenUnits,Name=Value)는 하나 이상의 이름-값 인수를 사용하여 추가로 OutputMode, 활성화, 상태, 파라미터 및 초기화, 학습률 및 정규화, Name 속성을 설정합니다.

속성

모두 확장

LSTM

은닉 유닛의 개수(은닉 크기라고도 함)로, 양의 정수로 지정됩니다.

은닉 유닛의 개수는 계층이 각 시간 스텝 사이에(은닉 상태) 유지하는 정보의 양에 대응됩니다. 은닉 상태는 시퀀스 길이와 관계없이 모든 이전 시간 스텝의 정보를 포함할 수 있습니다. 은닉 유닛의 길이가 너무 길면 계층이 훈련 데이터에 과적합될 수 있습니다. 은닉 상태는 한 회의 반복에서 계층이 처리하는 시간 스텝의 개수를 제한하지 않습니다.

이 계층은 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"인 하나의 입력값을 갖습니다. 이 입력값은 입력 데이터에 대응합니다. 이 경우 계층은 계층 연산에 HiddenState 속성과 CellState 속성을 사용합니다.

HasStateInputs 속성이 1(true)이면 계층은 이름이 각각 "in", "hidden", "cell"인 세 개의 입력값을 갖습니다. 이러한 입력값은 각각 입력 데이터, 은닉 상태, 셀 상태에 대응합니다. 이 경우 계층은 이러한 입력값에 전달된 값을 계층 연산에 사용합니다. HasStateInputs1(true)이면 HiddenState 속성과 CellState 속성은 비어 있어야 합니다.

읽기 전용 속성입니다.

상태 출력을 계층에 연결하는 플래그로, 0(false) 또는 1(true)로 지정됩니다.

HasStateOutputs 속성이 0(false)이면 계층은 이름이 "out"인 하나의 출력값을 갖습니다. 이 값은 출력 데이터에 대응합니다.

HasStateOutputs 속성이 1(true)이면 계층은 이름이 각각 "out", "hidden", "cell"인 세 개의 출력값을 갖습니다. 이러한 출력값은 각각 출력 데이터, 은닉 상태, 셀 상태에 대응합니다. 이 경우 계층은 계산된 상태 값도 출력합니다.

읽기 전용 속성입니다.

입력 크기로, 양의 정수 또는 "auto"로 지정됩니다. InputSize"auto"이면, 훈련 시점에 자동으로 입력 크기가 할당됩니다.

InputSize"auto"이면, LSTMLayer 객체는 이 속성을 문자형 벡터로 저장합니다.

데이터형: double | char | string

활성화

읽기 전용 속성입니다.

셀과 은닉 상태를 업데이트하는 활성화 함수로, 다음 값 중 하나로 지정됩니다.

  • "tanh" — 쌍곡탄젠트 함수(tanh)를 사용합니다.

  • "softsign" — 소프트사인 함수 softsign(x)=x1+|x|를 사용합니다.

  • "relu" (R2024a 이후) — ReLU(Rectified Linear Unit) 함수 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" – 단위 정규분포에서 샘플링된 확률 행렬 Z에 대한 Z = QR의 QR 분해로 주어지는 직교 행렬 Q를 사용하여 입력 가중치를 초기화합니다. [4]

  • "narrow-normal" – 평균이 0이고 표준편차가 0.01인 정규분포에서 독립적으로 샘플링하여 입력 가중치를 초기화합니다.

  • "zeros" – 입력 가중치를 0으로 초기화합니다.

  • "ones" – 입력 가중치를 1로 초기화합니다.

  • 함수 핸들 – 사용자 지정 함수를 사용하여 입력 가중치를 초기화합니다. 함수 핸들을 지정할 경우, 함수는 weights = func(sz) 형식이 되어야 합니다. 여기서 sz는 입력 가중치의 크기입니다.

계층은 InputWeights 속성이 비어 있는 경우에만 입력 가중치를 초기화합니다.

LSTMLayer 객체는 이 속성을 문자형 벡터 또는 함수 핸들로 저장합니다.

데이터형: char | string | function_handle

순환 가중치를 초기화하는 함수로, 다음 중 하나로 지정됩니다.

  • "orthogonal" – 단위 정규분포에서 샘플링된 확률 행렬 Z에 대한 Z = QR의 QR 분해로 주어지는 직교 행렬 Q를 사용하여 순환 가중치를 초기화합니다. [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*NumHiddenUnits×InputSize 행렬입니다.

순환 가중치로, 행렬로 지정됩니다.

순환 가중치 행렬은 LSTM 계층의 컴포넌트(게이트)에 대한 4개의 순환 가중치 행렬을 결합한 것입니다. 4개의 행렬은 다음과 같은 순서로 세로로 결합됩니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

순환 가중치는 학습 가능한 파라미터입니다. trainnet 함수를 사용하여 RNN을 훈련시킬 때 RecurrentWeights가 비어 있지 않으면 RecurrentWeights 속성이 초기값으로 사용됩니다. RecurrentWeights가 비어 있으면 RecurrentWeightsInitializer로 지정된 이니셜라이저가 사용됩니다.

훈련 시점에 RecurrentWeights4*NumHiddenUnits×NumHiddenUnits 행렬입니다.

계층 편향으로, 숫자형 벡터로 지정됩니다.

편향 벡터는 계층의 컴포넌트(게이트)에 대한 4개의 편향 벡터를 결합한 것입니다. 계층은 다음 순서로 4개의 벡터를 세로로 결합합니다.

  1. 입력 게이트

  2. 망각 게이트

  3. 셀 후보

  4. 출력 게이트

계층 편향은 학습 가능한 파라미터입니다. 신경망을 훈련시킬 때 Bias가 비어 있지 않으면 trainnettrainNetwork 함수는 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 배열 입력값에 대해 trainnetdlnetwork 함수는 이름이 ""인 계층에 자동으로 이름을 할당합니다.

LSTMLayer 객체는 이 속성을 문자형 벡터로 저장합니다.

데이터형: char | string

읽기 전용 속성입니다.

계층에 대한 입력값의 개수입니다.

HasStateInputs 속성이 0(false)이면 계층은 이름이 "in"인 하나의 입력값을 갖습니다. 이 입력값은 입력 데이터에 대응합니다. 이 경우 계층은 계층 연산에 HiddenState 속성과 CellState 속성을 사용합니다.

HasStateInputs 속성이 1(true)이면 계층은 이름이 각각 "in", "hidden", "cell"인 세 개의 입력값을 갖습니다. 이러한 입력값은 각각 입력 데이터, 은닉 상태, 셀 상태에 대응합니다. 이 경우 계층은 이러한 입력값에 전달된 값을 계층 연산에 사용합니다. HasStateInputs1(true)이면 HiddenState 속성과 CellState 속성은 비어 있어야 합니다.

데이터형: double

읽기 전용 속성입니다.

계층의 입력값 이름.

HasStateInputs 속성이 0(false)이면 계층은 이름이 "in"인 하나의 입력값을 갖습니다. 이 입력값은 입력 데이터에 대응합니다. 이 경우 계층은 계층 연산에 HiddenState 속성과 CellState 속성을 사용합니다.

HasStateInputs 속성이 1(true)이면 계층은 이름이 각각 "in", "hidden", "cell"인 세 개의 입력값을 갖습니다. 이러한 입력값은 각각 입력 데이터, 은닉 상태, 셀 상태에 대응합니다. 이 경우 계층은 이러한 입력값에 전달된 값을 계층 연산에 사용합니다. HasStateInputs1(true)이면 HiddenState 속성과 CellState 속성은 비어 있어야 합니다.

LSTMLayer 객체는 이 속성을 문자형 벡터로 구성된 셀형 배열로 저장합니다.

읽기 전용 속성입니다.

계층에 대한 출력값의 개수입니다.

HasStateOutputs 속성이 0(false)이면 계층은 이름이 "out"인 하나의 출력값을 갖습니다. 이 값은 출력 데이터에 대응합니다.

HasStateOutputs 속성이 1(true)이면 계층은 이름이 각각 "out", "hidden", "cell"인 세 개의 출력값을 갖습니다. 이러한 출력값은 각각 출력 데이터, 은닉 상태, 셀 상태에 대응합니다. 이 경우 계층은 계산된 상태 값도 출력합니다.

데이터형: double

읽기 전용 속성입니다.

계층의 출력값 이름.

HasStateOutputs 속성이 0(false)이면 계층은 이름이 "out"인 하나의 출력값을 갖습니다. 이 값은 출력 데이터에 대응합니다.

HasStateOutputs 속성이 1(true)이면 계층은 이름이 각각 "out", "hidden", "cell"인 세 개의 출력값을 갖습니다. 이러한 출력값은 각각 출력 데이터, 은닉 상태, 셀 상태에 대응합니다. 이 경우 계층은 계산된 상태 값도 출력합니다.

LSTMLayer 객체는 이 속성을 문자형 벡터로 구성된 셀형 배열로 저장합니다.

예제

모두 축소

이름이 "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 셀형 배열이며, 여기서 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

훈련 옵션을 지정합니다. Adam 솔버에 학습률을 0.01로, 기울기 임계값을 1로 설정하여 훈련시킵니다. 최대 Epoch 횟수를 200으로 설정하고 모든 Epoch를 섞습니다. 기본적으로 사용 가능한 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 회귀 항목을 참조하십시오.

LSTM 계층 앞에 출력 모드가 "sequence"인 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에 개발됨

모두 확장