<정방향 레이어의 노드 수> + <역방향 레이어의 노드 수>
이다.기존 정방향 레이어만 있을 때
역방향 레이어와 concat 함으로써, 모든 시점에서 과거 또는 미래의 맥락을 반영하여 feature representation을 할 수 있다.
"""
1. 시점 수 20, 데이터의 차원이 6인 Input layer
2. Conv1D
3. MaxPool1D
4. Bidirectional 레이어
forward layer : LSTM, 히든스테이트 노드 24개
backward layer : GRU, 히든스테이트 노드 16개
5. Bidirectional 레이어
forward layer : LSTM, 히든스테이트 노드 24개
backward layer : GRU, 히든스테이트 노드 24개
6. Flatten
7. Fully Connected
8. 출력 차원이 1인 output layer
"""
# 1. 세션 클리어
clear_session()
# 2. 레이어 연결
il = Input(shape=(20, 6))
hl = Conv1D(filters=32,
kernel_size=10,
strides=1,
padding='valid',
activation='swish')(il)
hl = MaxPool1D(pool_size=2)(hl)
forward_LSTM24_1 = LSTM(24, return_sequences=True)
backward_GRU16 = GRU(16, return_sequences=True, go_backwards=True)
hl = Bidirectional( layer=forward_LSTM24_1,
backward_layer=backward_GRU16,
name='Bidirectional_1' )(hl)
forward_LSTM24_2 = LSTM(24, return_sequences=True)
backward_GRU24 = GRU(24, return_sequences=True, go_backwards=True)
hl = Bidirectional( layer=forward_LSTM24_2,
backward_layer=backward_GRU24,
name='Bidirectional_2')(hl)
hl = Flatten()(hl)
hl = Dense(256, activation='swish', name='Fully_Connected')(hl)
ol = Dense(1, activation='relu', name='output')(hl) # 음수를 0으로 처리
# 3. 모델 선언
model = Model(il, ol)
# 4. 컴파일
model.compile(loss=keras.losses.mae, optimizer='adam')
# 요약
model.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 20, 6)] 0
conv1d (Conv1D) (None, 11, 32) 1952
max_pooling1d (MaxPooling1D (None, 5, 32) 0
)
Bidirectional_1 (Bidirectio (None, 5, 40) 7872
nal)
Bidirectional_2 (Bidirectio (None, 5, 48) 10992
nal)
flatten (Flatten) (None, 240) 0
Fully_Connected (Dense) (None, 256) 61696
output (Dense) (None, 1) 257
=================================================================
Total params: 82,769
Trainable params: 82,769
Non-trainable params: 0
_________________________________________________________________
Input에서 20개였던 시점이 kernel_size가 10인 Conv1D를 통과하여 10개로, pool_size가 2인 MaxPool1D를 통과하여 5개로 축소되었다.
Bidirectional_1에서 정방향 LSTM 24개, 역방향 GRU 16개가 concat되어 output의 노드 수가 40개임을 확인할 수 있다.
Bidirectional_2에서 정방향 LSTM 24개, 역방향 GRU 24개가 concat되어 output의 노드 수가 48개임을 확인할 수 있다.