di

코드리뷰 MLM블로그 Demonstration of Memory with a Long Short-Term Memory Network in Python -2

정지홍 2023. 3. 3. 11:13

https://machinelearningmastery.com/memory-in-a-long-short-term-memory-network/

 

LSTM을 이용한 시퀀스 학습

 

이 섹션에서는 인풋 시퀀스를 가지고 LSTM을 학습시킬 것이다.

  • LSTM 구성
  • LSTM 훈련
  • LSTM 평가
  • LSTM 예제 완료하기

LSTM 구성

 

우리는 LSTM이 한 단계를 예측하는 것을, 우리가 정의한 데이터셋의 포멧과 형태에 대해서. 또 한 LSTM이 각 단계뒤에 오차를 업데이트하는 것도 원한다. 이것은 우리가 하나의 배치 사이즈를 사용해야 한다는 것도 의미한다.

 

케라스의 LSTM은 디폴트로 배치가 상태유지 되지 않는다. 우리는 그들을 LSTM층의 상태유지 인자를 True로 하고 훈련 횟수를 수동적으로 보장하여 내부 LSTM상태가 각각의 시퀀스 후에 재설정하게 해서  상태유지를 할 수 있게 만들수 있다.

 

우리는 배치의 형태를 3차원으로 정의해야만 한다. [배치사이즈,타임스텝,특성]

 

네트워크 토폴로지( 컴퓨터 네트워크의 요소들을 물리적으로 연결해 놓은 것)는 20개의 유닛과 5개의 출력이 있는 normal dense layer  하나의 LSTM층을 구성한다. 시그모이드 활성화함수는 출력층에서 사용될 것이다. 이유는 이진 출력과 기반 하이퍼볼릭 탄젠트 활성화 함수가 LSTM층에서 사용 될 것이기 때문이다.

 

교차손실함수를 옵티마이저로 사용할것이다. 네트워크를 훈련시킬때. 이유는 이진 출력과 효율적이 Adam최적화 알고리즘을 모든 기본 파라미터로 사용할 예정이기 때문이다.

케라스 코드로 문제를 위한 LSTM을 정의


LSTM 훈련

 

우리는 수동적으로 한번에 한번씩 훈련시켜야한다.

 

한 에포크이내에, 우리는 각 시퀀스를 훈련시킬 수 있다. 그후에 시퀀스를 재설정해야한다.

 

모델은 문제가 간단해서 오래 훈련시킬 필요가 없다. 이 경우에는 250번정도만 필요하다.

 

훈련시킬때, 우리는 손실함수로부터 피드백을 받는 것을 볼 수 있다. (verbose=1로 설정해서). 하지만 다른 훈련은 verbose=0으로 해서 출력x


LSTM 평가

 

다음, 우리는 학습한 시퀀스를 예측함으로써 모델이 잘 훈련되었는지 평가할 수 있다.

 

우리는 각 시퀀스의 결과를 예측 할 수 있다.

 

predict_classes()함수는 클래스를 직접 예측하는 LSTM모델에 사용될 수 있다. 이것은 출력 이진 벡테에서 argmax()를 수행하며 가장 큰 출력을 가진 예측 컬럼의 인덱스를 리턴한다. 출력 지수는 완벽히 매핑된다, 사용된 정수에 대해서.

우리는 예측을 할 수 있다. 그리고 인력 문장에 대한 결과를 프린트하고 시퀀스의 각 스텝의 출력 패턴을 예측할 수 있다.


LSTM 예제 완료

 

우리는 튜토리얼을 같이해고 있으며 아래 코드를 가지고 완성할 수 있다. 첫번째 데이터를 준비하고, 모델을 훈련시키고 시퀀스 예측을 프린트한다.

Sequence 1
X=3.0 y=0.0, yhat=0.0
X=0.0 y=1.0, yhat=1.0
X=1.0 y=2.0, yhat=2.0
X=2.0 y=3.0, yhat=3.0
Sequence 2
X=4.0 y=0.0, yhat=0.0
X=0.0 y=1.0, yhat=1.0
X=1.0 y=2.0, yhat=2.0
X=2.0 y=4.0, yhat=4.0
 
결과를 통하여 다음을 알 수 있다.
  • LSTM은 각 시간스텝에 맞는 얼 바를 할습을 한다
  • LSTM은 충돌되는 인풋 쌍을 올바르게 해결하기 위해 각 시퀀스의 컨텍스트를 사용.