블로그 이미지
Flying Mr.Cheon youGom

Recent Comment»

Recent Post»

Recent Trackback»

« 2024/5 »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

https://yougome.tistory.com/558

 

은근히 시간이 걸린 내용이라 정리해 두려고 한다.

LSTM을 살펴보면 대부분 Sequence layer를 활용해서 설명하고 있어서,

찾는시간에도, 오류를 잡고, 내용을 이해하는데에도 시간이 좀 들었다.

주요 오류는 Input(...) 다음에 LSTM(...) 을 읽는 위치에서 계속 막혔다.

inputs = Input(shape=( ..., ))

outputs = LSTM(1, ... )(inputs) 

오류의 포인트는 shape 값 때문이었다.

찾아봐도 명쾌한 답이 잘 안나오니 답답할 뿐이었다.

 

대부분 알고 있겠지만, LSTM의 shape의 의미는 size, seq, feature다. 

이 내용을 토대로 계속 입력하지만 계속 오류가 발생한다.

여기서 오류를 범할 수 있는 부분이 바로, size 부분이다. input shape를 seq, feautre로 두고 처리하면 해결된다.

 

size는 결국에 model을 compile한 후, fit을 할 때 사용되는 loop의 크기로 보면 좋을 것 같다.

 

이렇게 간단히 해결될 것을.. 왜이리 오래 걸렸을까?

기본 tutorial 코드를 보면, LSTM( ) 함수에는 몇가지 추가된 파라미터들이 있다.

stateful, return_sequence 등을 추가되어 있다.

입문자나 초보자 입장에서는 이게 없으면 안될 것 같은,,

느낌적인 느낌때문에 지운 후 쓰기도 그대로 쓰기도

어떻게 할지 몰라서 망설여지게 된다.

 

오류를 잘 살펴보면, stateful을 쓰려면 batch_input_shape 쓰라고 하고,

batch_input_shape를 빼면, input_shape가 맞지 않다고 하니,

어느 장단에 맞춰야할지 무척 난감해진다.

 

에러를 해석해보면,

stateful은 batch의 총 크기를 알았을 때 안정적으로 사용할 수 있다는 것이고,

stateful을 쓰지 않는다면, 굳이 없어도 동작한다. ( 확인했음 )

 

즉, Model의 Input(...) 이용해서 LSTM을 처리하고자 한다면 아래 두개 코드중에 하나를 선택해서 쓰면되겠다.

간단한 코드가 좋으니.. 아래와 같이 정리한다.

첫줄의 Input(..)함수의 batch_shape shape부분을 살펴보면 좋겠다.

 

# stateful 파라미터를 쓰고 싶다! 그러면 batch_shape로 하면된다.

#site : https://yougome.tistory.com/558

input_tensor = Input(batch_shape=(1, 10, 2, ))
hidden_tensor = LSTM(1, batch_input_shape=(1, 10, 2), stateful=True, return_sequences=True )(input_tensor)
hidden_tensor = LSTM(1, stateful=True)(hidden_tensor)
output_tensor = Dense(2, )(hidden_tensor)
m_model = Model(inputs=input_tensor, outputs = output_tensor)
m_model.summary()

 

# stateful 파라미터에 관심없다! 동작만 하면된다!! 그러면 shape로 하면된다.

#site : https://yougome.tistory.com/558

input_tensor = Input(shape=(10, 2, ))
hidden_tensor = LSTM(1, input_shape=(10, 2), return_sequences=True )(input_tensor)
hidden_tensor = LSTM(1)(hidden_tensor)
output_tensor = Dense(2)(hidden_tensor)
m_model = Model(inputs=input_tensor, outputs = output_tensor)
m_model.summary()

 

위에 있는 코드가 좀 더 상세히 쓴 것이고,

케라스의 특성상, 이전에 입력받은 Layer는 다음 Layer에서 알아서 척척(?) 잘 받아주니,

아래 처럼 써도 전혀 문제가 없다.

 

# stateful 파라미터를 쓰고 싶다! 그러면 batch_shape로 하면된다.

#site : https://yougome.tistory.com/558

input_tensor = Input(batch_shape=(1, 10, 2, ))
hidden_tensor = LSTM(1, stateful=True, return_sequences=True )(input_tensor)
hidden_tensor = LSTM(1, stateful=True)(hidden_tensor)
output_tensor = Dense(2, )(hidden_tensor)
m_model = Model(inputs=input_tensor, outputs = output_tensor)
m_model.summary()

summary 결과 값 보고 싶다면, 아래 '더보기' 클릭

더보기

Model: "model_x"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_24 (InputLayer)        (1, 10, 2)                0         
_________________________________________________________________
lstm_30 (LSTM)               (1, 10, 1)                16        
_________________________________________________________________
lstm_31 (LSTM)               (1, 1)                    12        
_________________________________________________________________
dense_11 (Dense)             (1, 2)                    4         
=================================================================
Total params: 32
Trainable params: 32
Non-trainable params: 0
_________________________________________________________________

 

# stateful 파라미터에 관심없다! 동작만 하면된다!! 그러면 shape로 하면된다.

#site : https://yougome.tistory.com/558

input_tensor = Input(shape=(10, 2, ))
hidden_tensor = LSTM(1, return_sequences=True )(input_tensor)
hidden_tensor = LSTM(1)(hidden_tensor)
output_tensor = Dense(2)(hidden_tensor)
m_model = Model(inputs=input_tensor, outputs = output_tensor)
m_model.summary()

summary 결과 값 보고 싶다면, 아래 '더보기' 클릭

더보기

Model: "model_x" 
_________________________________________________________________ 
Layer (type)                 Output Shape              Param #    
================================================================= 
input_23 (InputLayer)        (None, 10, 2)             0          
_________________________________________________________________ 
lstm_28 (LSTM)               (None, 10, 1)             16         
_________________________________________________________________ 
lstm_29 (LSTM)               (None, 1)                 12         
_________________________________________________________________ 
dense_10 (Dense)             (None, 2)                 4          
================================================================= 
Total params: 32 
Trainable params: 32 
Non-trainable params: 0

 

 

아차, 다 쓰고 나서 읽어보니, 헷갈릴 수 있는 부분이 있어서 덧붙인다.

 

input의 shape 크기가 ( 10, 2 ) 인지,

output의 shape 크기가 2 인지,

>> input shape는 2개의 특징을 가진 10개의 연속된 데이터 N개를 사용하고 있고,

>> ouput shape는 2개의 특징으로 분류되는 N의 결과값을 사용하고 있다

 

( 10, 2 ) 이 부분은 큰 의미는 없고,

model 관련 dummy data로 테스트하던 중에 사용하던 코드여서,

그대로 붙여넣게 되었다.

 

ref : https://keras.io/getting-started/functional-api-guide/

: