1번째 줄: |
1번째 줄: |
| == 개요 == | | == 개요 == |
| 케라스로 LSTM 구현해보기. | | 케라스로 LSTM 구현해보기. |
| + | |
| + | RNN과 거의 동일하다.(옵션이나 발생하는 에러도 유사.) |
| | | |
| == 설계 == | | == 설계 == |
21번째 줄: |
23번째 줄: |
| X_test_t = X_test.reshape(배치사이즈, 행갯수, 열갯수) | | X_test_t = X_test.reshape(배치사이즈, 행갯수, 열갯수) |
| </syntaxhighlight>마지막의 1은 각 셀 안의 데이터를 개별 처리하기 위한 것.(1이 없으면 한 행의 데이터가 하나의 셀로 처리된다.) | | </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]] |