"Keras:LSTM"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
잔글 (→‎원인)
 
54번째 줄: 54번째 줄:
 
학습률을 낮추거나.
 
학습률을 낮추거나.
 
|-
 
|-
|
+
|계산 도중 log(0)이 실행된다.
|
+
|오차역전파 때 0이 전달되어 발생하는듯.
 
|
 
|
 
|-
 
|-
86번째 줄: 86번째 줄:
 
|경사 clipping.
 
|경사 clipping.
 
|옵티마이저에서 조절할 수 있는 옵션이다.
 
|옵티마이저에서 조절할 수 있는 옵션이다.
 +
|-
 +
|GRU 사용 피하기
 +
|유독 GRU를 사용할 때 잘 나타나는 에러이다.
 
|}
 
|}
  

2022년 1월 28일 (금) 16:44 기준 최신판

1 개요[편집 | 원본 편집]

케라스로 LSTM 구현해보기.

RNN과 거의 동일하다.(옵션이나 발생하는 에러도 유사.)

2 설계[편집 | 원본 편집]

from keras.models import Sequential

model = Sequential()
# 필요한 층을 더한다.
model.add(LSTM(50, return_sequences=True, input_shape=(50,1)))  # 50개 유닛을 갖는 LSTM층 생성. 일반적으로 50개의 입력이 들어간다.
# input_shape에서 50개를 넣어 1개를 반환받는다는 의미인듯..? 일반적으로 timestamp,feature이라는데.. 
model.add(Dense(1, activation='linear'))  # 일반 뉴런층 1개. 결과가 1개가 나온다.
model.compile(loss='mse', optimizer='rmsprop')  # 손실함수 따위를 결정한다.

2.1 input_shape[편집 | 원본 편집]

인풋 형태는 (타임스템프, feature) 형태이다. 다음과 같이 모양을 다시 잡아주어 형태를 변형한다.(size를 포함하여 정리한 후, 모델 input에서 다시 형태를 정의한다.)

X_train_t = X_train.reshape(배치사이즈, 행갯수, 열갯수)
X_test_t = X_test.reshape(배치사이즈, 행갯수, 열갯수)

마지막의 1은 각 셀 안의 데이터를 개별 처리하기 위한 것.(1이 없으면 한 행의 데이터가 하나의 셀로 처리된다.)

3 옵션[편집 | 원본 편집]

3.1 return_sequences[편집 | 원본 편집]

마지막 시퀀스에서 한 번만 출력할지, 각 시퀀스에서 출력할지 결정. 일반적으로 many to many 문제를 풀 때나 lstm 층을 여러개로 쌓아올릴 때 True를 사용한다.

3.2 stateful[편집 | 원본 편집]

학습샘플의 마지막 상태가 다음 학습 때 입력으로 전달할지 여부를 결정.

4 에러[편집 | 원본 편집]

4.1 loss : nan 으로 나오는 경우[편집 | 원본 편집]

이거 정말.. 골때리는 에러다.

4.1.1 원인[편집 | 원본 편집]

한 번 발생하면 계속 발생하는데... 원인 찾기가 너무 힘들다..

예상되는 원인 설명 해결방안
사용하는 데이터에 nan이 섞인 경우 사용하는 데이터에 하나라도 nan 값이 있으면 이렇게 나온다.

학습을 시작하자마자 loss : nan 이 나오는 경우이다.

dataframe의 dropna() 따위로 처리한다..
기욹기팽창(로스값이 너무 커서) 로스값이 너무 커지면 학습값이 너무 커져서 어느 순간 기울기가 발산해버릴 때가 있다. 모델의 크기를 줄이거나..(근데, 로스가 1자리 숫자여도 nan이 발생한다..)

학습률을 낮추거나.

계산 도중 log(0)이 실행된다. 오차역전파 때 0이 전달되어 발생하는듯.
해볼 수 있는 시도 설명
dropout 값을 낮춘다.
L1, L2 규제를 낮추거나 없앤다.
옵티마이저를 바꾼다. 대부분 Adam으로 바꾸라는 조언이 많은데.. 이걸 바꿔도 안없어지는 경우가 많다.)
데이터 노멀라이징. 이걸 했는데도 발생하는 경우는 어찌할꼬....
활성화함수 바꾸기. 적절한 활성화 함수인데도 생긴다. 어찌할꼬...
배치사이즈 늘리기. 데이터의 배치사이즈를 크게 해서 한번에 학습되는 량이 많게끔.
경사 clipping. 옵티마이저에서 조절할 수 있는 옵션이다.
GRU 사용 피하기 유독 GRU를 사용할 때 잘 나타나는 에러이다.

4.2 ValueError: Input 0 of layer lstm_1 is incompatible with the layer: expected...[편집 | 원본 편집]

여러 개의 LSTM 층을 쌓을 때 발생하는 에러이다. 2번째 LSTM으로 들어갈 때 기대한 Input과 실제 들어온 것이 달라 발생하는 에러로, 이전 LSTM 층에 return_sequences=True 옵션을 주면 된다.