1 분 소요

본 게시물은 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)

댓글남기기