조이 생각

반응형

 

지난번 포스팅에 이어서, 3차원으로 이뤄진 데이터를

 

순환신경망에 input으로 넣는 방법을 다뤄보겠습니다.

 

 

[지난 포스팅]

2021/01/27 - [머신러닝/TensorFlow] - 텐서플로우2(TensorFlow 2 ver.) 시계열 데이터 전처리 및 모델 입력 방법 1

 

텐서플로우2(TensorFlow 2 ver.) 시계열 데이터 전처리 및 모델 입력 방법 1

시계열 학습에 대한 자료로 자연어처리 예제들을 다양하게 찾아볼 수 있습니다. 하지만, 자연어 처리라 할지라도 개인이 해결하고자 하는 데이터에 대한 데이터 처리는 각자의 몫이 되는 것 같

joytk.tistory.com


 

1. 원본 데이터 준비 

 

3차원으로 이루어진 원본 데이터를 준비합니다.

 

저는 가라데이터를 만들었습니다.

 

data = [[[0, 1, 1, 0, 1], [0, 1, 0, 0, 0], [1, 0, 1, 0, 1]],
        [[0, 1, 0, 0, 1], [0, 0, 1, 0, 1], [0, 1, 1, 0, 1], [0, 0, 1, 0, 0]],
        [[1, 0, 1, 1, 1], [0, 1, 1, 1, 1]]]

 

총 3개의 데이터 이고,

 

시퀀스의 길이는 3, 4, 2 로 다양하게 구성되어 있는 데이터 입니다.

 

 

2. 시퀀스 패딩 (sequence padding)

 

지난 시간과 같이

 

여기서 가장 긴 시퀀스인 4에 맞춰주겠습니다.

 

from tensorflow.keras import preprocessing

padding_inputs = preprocessing.sequence.pad_sequences(data, padding='post')

print(padding_inputs)
[출력 결과]
array([[[0, 1, 1, 0, 1], [0, 1, 0, 0, 0], [1, 0, 1, 0, 1], [0, 0, 0, 0, 0]],
        [[0, 1, 0, 0, 1], [0, 0, 1, 0, 1], [0, 1, 1, 0, 1], [0, 0, 1, 0, 0]],
        [[1, 0, 1, 1, 1], [0, 1, 1, 1, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]])

 

전체 시퀀스 길이가 4로 맞춰졌습니다.

 

 

모델 학습에 사용하기 위해 numpy 배열로 만들어 주면

 

shape 함수를 통해 모양이 (3, 4, 5) 인것을 확인해 볼 수 있습니다.

 

 

3. 마스킹 (Masking)

 

이전 포스팅과 마찬가지로 일부가 0으로 채워졌다는 사실을

 

모델에게 알리기 위해 마스킹을 해주겠습니다.

 

이번에는 3차원 배열 데이터를 사용함으로 Masking Layer를 사용하겠습니다.

 

from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow import keras

inputs = keras.Input(shape=(input_x.shape[1], input_x.shape[2]))
l = layers.Masking(mask_value=0.0)(inputs)
l = layers.LSTM(units=50)(l)
l = layers.Dense(input_x.shape[2], activation='relu')(l)
outputs = layers.Dense(11, activation='softmax')(l)

model = models.Model(inputs, outputs, name='my_model')

model.summary()

 

 

이제 모델을 컴파일하고

 

임의의 라벨(정답)을 생성해서 학습을 시켜보겠습니다.

 

이전 포스팅과 다르게 분류(classification) 문제로 학습을 해보겠습니다.

 

예측과 정답의 오차를 계산하는 loss 부분이 다른점 입니다.

from tensorflow.keras import optimizers

input_y = np.array([1,2,0])
model.compile(loss='sparse_categorical_crossentropy',
              optimizer=optimizers.Adam(1e-4),
              metrics=['accuracy'])
model.fit(input_x, input_y, epochs=5)

 

 

성능이 좋진 않지만 잘 돌아갑니다.

 

이제 본인의 데이터를 넣어 epoch, batch 를 늘려보고 층을 추가해 보면서 

 

다양하게 실행해 보시기 바랍니다.

 

 

도움이 되셨다면 공감 클릭 부탁드립니다 :)

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band
loading