조이 생각

반응형

 

시계열 학습에 대한 자료로 자연어처리 예제들을 다양하게 찾아볼 수 있습니다.

 

하지만, 자연어 처리라 할지라도

 

개인이 해결하고자 하는 데이터에 대한 데이터 처리는 각자의 몫이 되는 것 같습니다.

 

 

틀릴 수도 있는 얘기이지만, 인공지능 학습 모델에는 정답이 없고

 

정답에 근사하게 만들어 나가는 것이 우리의 과제라고 생각합니다. (ㅠ_ㅠ)

 

 

그러나 일부 머신러닝 개발 프레임워크를 사용하는데 있어서

 

공통되는(?) 개념 정도는 공유가 가능하고 도움이 될 수도 있다는 생각에 글을 써봅니다.

 

 


크게 2가지 데이터를 기준으로 설명하려고 합니다.

 

사전 기반 2차원 데이터 (2D Matrix)

# 사전에는 1~4 에 대한 index가 있다고 가정
data = [['b','e','a'],['c','a'],['a','d','c','c','b']]

 

일반적인 3차원 데이터 (3D Matrix)

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]]]

이번 포스팅에서는 사전 기반 2차원 데이터 를 다루겠습니다.

 

 

1. 사전 생성

 

시계열 데이터 안에 존재하는 데이터들의 사전(dictonary)을 생성합니다.

 

다들 알맞게 만드시겠지만, 설명을 위해 간략하게 생성하겠습니다.

 

dic = ['a','b','c','d','e']  # 중복제거된 데이터

# key : data, value : index
data_idx_dic = dict((data, i+1) for i, data in enumerate(dic))
# key : index, value : data
idx_data_dic = {val: key for key, val in data_idx_dic.items()}

print(data_idx_dic)
print(idx_data_dic)

 

[출력 결과]
data_idx_dic => {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
idx_data_dic => {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

 

 

2. 데이터 치환 (raw > index)

 

앞서 만든 사전을 이용해 원본 데이터를 치환해 줍니다.

 

idx_input = [[data_idx_dic[i] for i in seq] for seq in data]
print(idx_input)
[출력 결과]
idx_input => [[2, 5, 1], [3, 1], [1, 4, 3, 3, 2]]

 

 

3. 시퀀스 패딩 (sequence padding)

 

데이터의 시퀀스 길이가 3, 2, 5로 다 다릅니다

 

이런 경우 일반적으로 가장 긴 시퀀스에 모양을 맞춥니다. 

 

저는 keras의 Preprocessor 라이브러리를 이용해서 뒤쪽에 0을 넣고 모양을 맞추겠습니다.

 

from tensorflow.keras import preprocessing
# padding 파라미터 : 'pre' 앞쪽, 'post' 뒤쪽
padding_inputs = preprocessing.sequence.pad_sequences(idx_input, padding='post')

print(padding_inputs)
[출력 결과]
padding_inputs => array([[2, 5, 1, 0, 0], [3, 1, 0, 0, 0], [1, 4, 3, 3, 2]])

 

 

데이터의 모양 변화를 되 짚어 보면

 

    [['b','e','a'],['c','a'],['a','d','c','c','b']] 

-> [[2, 5, 1], [3, 1], [1, 4, 3, 3, 2]]

-> [[2, 5, 1, 0, 0], [3, 1, 0, 0, 0], [1, 4, 3, 3, 2]] 

 

이렇게 되었고, numpy array로 변환 하여 shape 을 출력해 보면 

 

 

모두 시퀀스의 길이가 5인 형태가 되었습니다.

 

 

4. 마스킹 (Masking)

 

데이터의 일부가 0으로 채워졌다는 것을 모델에게 알려야합니다.

 

사전 기반 2차원 데이터는 Embedding Layer 를 사용하여 마스킹 해줄 수 있습니다.

 

 

모델생성 방법은 TensorFlow keras에서 다양한 방법을 제공하고 있습니다.

▼▼▼▼▼

더보기

1. Sequential()을 생성하고 add 하는 방법
    model = keras.Sequential()
    model.add(layers.Dense(2, activation="relu"))
    model.add(layers.Dense(3, activation="relu"))
    model.add(layers.Dense(4))

2. Sequential 선언시 layer 들을 넣는 방법
     model = keras.Sequential([ layers.Dense(2, activation="relu"),
                                         layers.Dense(3, activation="relu"),
                                         layers.Dense(4),])

3. models.Model을 이용해 inputs, outputs를 넣는 방법
    inputs = keras.Input(shape=(self.input_shape[1])
    l = layers.Dense(2, activation="relu")(inputs)
    l = layers.Dense(3, activation="relu")(l)
    outputs = layers.Dense(4)(l)
    models.Model(inputs, outputs)

 

- 참고 : www.tensorflow.org/guide/keras/sequential_model

 

아래와 같이 모델을 만들어 주었습니다.

 

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

inputs = keras.Input(shape=(padding_inputs.shape[1]))
l = layers.Embedding(input_dim=len(data_idx_dic)+1, output_dim=16, mask_zero=True)(inputs)
l = layers.LSTM(16)(l)
l = layers.Dense(100, activation='relu')(l)
outputs = layers.Dense(1)(l)

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

model.summary()

 

※ 여기서 주의할 점은 

 

layers.Embedding 파라미터의 input_dim 입니다.

 

input_dim에 들어가야할 숫자는 사전에 있는 가장 큰 index + 1 입니다.

 

사전의 index가 0부터 시작한다면, 사전 길이를 input_dim에 입력해 주시면 됩니다.

 

"Size of the vocabulary, i.e. maximum integer index + 1."

(- 참고 : www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding)

 

 

 

 

이제 이 모델에 준비된 input_x와 input_y를 넣어 학습시켜 보시기 바랍니다.

 

 

input_y = np.array([10,20,15])

model.compile(loss='mean_squared_error',optimizer = keras.optimizers.Adam(1e-4),metrics=['accuracy'])
model.fit(input_x, input_y, epochs=5)

 

 

 

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

 

 

 

 

 

 

 

 

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band
loading