RNN
본 게시물은 tensorflow의 포스트를 보고 정리하는 글이다.
tf.keras.layers.RNN(
cell,
return_sequences=False,
return_state=False,
go_backwards=False,
stateful=False,
unroll=False,
time_major=False,
**kwargs
)
📌 Args
- cell: RNN, LSTM 등의 instance 혹은 instance list이며 이들은 아래 내용을 포함해야 한다.
call
: (input_at_t1, states_at_t1)를 인자로 받는 method로 (output_t1, states_t2)을 return 한다.state_size
: hidden size의 크기이다.output_size
: output의 크기이다.get_initial_state(inputs=None, batch_size=None, dtype=None)
: 만약 사용자가 initail state를 지정하지 않았을 때, call method에 초기화된 tensor를 공급하는 method이다. 초기화된 tensor의 shape는 [batch_size, cell.state_size]여야 한다.
- return_sequences: True일 경우 output sequence 전체를 반환하며, False일 경우 마지막 time step의 output만을 반환한다.(default False)
- return_state: output 외에 마지막 hidden sate를 반환 할 지에 대한 여부이다.(default False)
- go_backwards: True이면 input sequence를 거꾸로 처리한 결과를 반환한다. Bidirectional layer를 custom 할 때(=정방향, 역방향을 따로 지정할때), 사용한다.(default False)
- stateful: True일 경우, batch의 마지막 hidden state가 다음 batch의 초기값으로 적용된다.(default False)
- unroll: 메모리를 더 많이 사용하나 RNN의 속도를 높일 수 있다. 짧은 sequence에 사용된다.(default False)
- time_major: True인 경우 input 및 output의 모양이 (timesteps, batch, …), False인 경우 (batch, timesteps, …)
- zero_output_for_mask: 반환된 output sequence 중 masking된 timestep output에 0을 사용하는지 여부이다. 이는 return_sequences가 True이고 mask가 적용된 경우에만 사용된다.
📌 Input shape
time_major가 True일 경우 [timesteps, batch_size, ...]
, 일반적으로는 [batch_size, timesteps, ...]
📌 Output shape
- return_state가 True일 경우 tensor list를 return한다. list의 첫번째 요소는 output이며 두번째 요소는 [batch_size, state_size] 형태의 마지막 state이다.
- return_sequences가 True일 경우 [batch_size, timesteps, output_size]을 return한다.
📌 Masking
RNN layer는 가변적인 input을 처리하기 위하여 masking을 지원한다. 이를 적용하려면 mask_zero를 True로 설정한 Embedding layer를 사용해야한다.
📌 Example
import tensorflow as tf
# single cell
cell = tf.keras.layers.LSTMCell(4)
x = tf.keras.Input((None, 5))
layer = tf.keras.layers.RNN(cell)
y = layer(x)
print(y.shape)
(None, 4)
# stacked RNN
cells = [tf.keras.layers.LSTMCell(32), tf.keras.layers.LSTMCell(64)]
x = tf.keras.Input((None, 5))
layer = tf.keras.layers.RNN(cells)
y = layer(x)
print(y.shape)
(None, 64)
댓글남기기