"Keras:LSTM"의 두 판 사이의 차이
둘러보기로 가기
검색하러 가기
(→설계) |
잔글 (→원인) |
||
(같은 사용자의 중간 판 9개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
== 개요 == | == 개요 == | ||
케라스로 LSTM 구현해보기. | 케라스로 LSTM 구현해보기. | ||
+ | |||
+ | RNN과 거의 동일하다.(옵션이나 발생하는 에러도 유사.) | ||
== 설계 == | == 설계 == | ||
9번째 줄: | 11번째 줄: | ||
# 필요한 층을 더한다. | # 필요한 층을 더한다. | ||
model.add(LSTM(50, return_sequences=True, input_shape=(50,1))) # 50개 유닛을 갖는 LSTM층 생성. 일반적으로 50개의 입력이 들어간다. | model.add(LSTM(50, return_sequences=True, input_shape=(50,1))) # 50개 유닛을 갖는 LSTM층 생성. 일반적으로 50개의 입력이 들어간다. | ||
− | # input_shape에서 50개를 넣어 1개를 반환받는다는 의미인듯..? | + | # input_shape에서 50개를 넣어 1개를 반환받는다는 의미인듯..? 일반적으로 timestamp,feature이라는데.. |
model.add(Dense(1, activation='linear')) # 일반 뉴런층 1개. 결과가 1개가 나온다. | model.add(Dense(1, activation='linear')) # 일반 뉴런층 1개. 결과가 1개가 나온다. | ||
model.compile(loss='mse', optimizer='rmsprop') # 손실함수 따위를 결정한다. | model.compile(loss='mse', optimizer='rmsprop') # 손실함수 따위를 결정한다. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | === input_shape === | ||
+ | 인풋 형태는 (타임스템프, feature) 형태이다. 다음과 같이 모양을 다시 잡아주어 형태를 변형한다.(size를 포함하여 정리한 후, 모델 input에서 다시 형태를 정의한다.) | ||
+ | <syntaxhighlight lang="python"> | ||
+ | X_train_t = X_train.reshape(배치사이즈, 행갯수, 열갯수) | ||
+ | X_test_t = X_test.reshape(배치사이즈, 행갯수, 열갯수) | ||
+ | </syntaxhighlight>마지막의 1은 각 셀 안의 데이터를 개별 처리하기 위한 것.(1이 없으면 한 행의 데이터가 하나의 셀로 처리된다.) | ||
+ | |||
+ | == 옵션 == | ||
+ | |||
+ | === return_sequences === | ||
+ | 마지막 시퀀스에서 한 번만 출력할지, 각 시퀀스에서 출력할지 결정. 일반적으로 many to many 문제를 풀 때나 lstm 층을 여러개로 쌓아올릴 때 True를 사용한다. | ||
+ | |||
+ | === stateful === | ||
+ | 학습샘플의 마지막 상태가 다음 학습 때 입력으로 전달할지 여부를 결정. | ||
+ | |||
+ | = 에러 = | ||
+ | |||
+ | === loss : nan 으로 나오는 경우 === | ||
+ | 이거 정말.. 골때리는 에러다. | ||
+ | |||
+ | ==== 원인 ==== | ||
+ | 한 번 발생하면 계속 발생하는데... 원인 찾기가 너무 힘들다.. | ||
+ | {| class="wikitable" | ||
+ | !예상되는 원인 | ||
+ | !설명 | ||
+ | !해결방안 | ||
+ | |- | ||
+ | |사용하는 데이터에 nan이 섞인 경우 | ||
+ | |사용하는 데이터에 하나라도 nan 값이 있으면 이렇게 나온다. | ||
+ | 학습을 시작하자마자 loss : nan 이 나오는 경우이다. | ||
+ | |dataframe의 dropna() 따위로 처리한다.. | ||
+ | |- | ||
+ | |기욹기팽창(로스값이 너무 커서) | ||
+ | |로스값이 너무 커지면 학습값이 너무 커져서 어느 순간 기울기가 발산해버릴 때가 있다. | ||
+ | |모델의 크기를 줄이거나..(근데, 로스가 1자리 숫자여도 nan이 발생한다..) | ||
+ | 학습률을 낮추거나. | ||
+ | |- | ||
+ | |계산 도중 log(0)이 실행된다. | ||
+ | |오차역전파 때 0이 전달되어 발생하는듯. | ||
+ | | | ||
+ | |- | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |} | ||
+ | {| class="wikitable" | ||
+ | !해볼 수 있는 시도 | ||
+ | !설명 | ||
+ | |- | ||
+ | |dropout 값을 낮춘다. | ||
+ | | | ||
+ | |- | ||
+ | |L1, L2 규제를 낮추거나 없앤다. | ||
+ | | | ||
+ | |- | ||
+ | |옵티마이저를 바꾼다. | ||
+ | |대부분 Adam으로 바꾸라는 조언이 많은데.. 이걸 바꿔도 안없어지는 경우가 많다.) | ||
+ | |- | ||
+ | |데이터 노멀라이징. | ||
+ | |이걸 했는데도 발생하는 경우는 어찌할꼬.... | ||
+ | |- | ||
+ | |활성화함수 바꾸기. | ||
+ | |적절한 활성화 함수인데도 생긴다. 어찌할꼬... | ||
+ | |- | ||
+ | |배치사이즈 늘리기. | ||
+ | |데이터의 배치사이즈를 크게 해서 한번에 학습되는 량이 많게끔. | ||
+ | |- | ||
+ | |경사 clipping. | ||
+ | |옵티마이저에서 조절할 수 있는 옵션이다. | ||
+ | |- | ||
+ | |GRU 사용 피하기 | ||
+ | |유독 GRU를 사용할 때 잘 나타나는 에러이다. | ||
+ | |} | ||
+ | |||
+ | === ValueError: Input 0 of layer lstm_1 is incompatible with the layer: expected... === | ||
+ | 여러 개의 LSTM 층을 쌓을 때 발생하는 에러이다. 2번째 LSTM으로 들어갈 때 기대한 Input과 실제 들어온 것이 달라 발생하는 에러로, 이전 LSTM 층에 <code>return_sequences=True</code> 옵션을 주면 된다. | ||
[[분류:Keras]] | [[분류:Keras]] | ||
[[분류:LSTM]] | [[분류:LSTM]] |
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
옵션을 주면 된다.