시계열 학습에 대한 자료로 자연어처리 예제들을 다양하게 찾아볼 수 있습니다.
하지만, 자연어 처리라 할지라도
개인이 해결하고자 하는 데이터에 대한 데이터 처리는 각자의 몫이 되는 것 같습니다.
틀릴 수도 있는 얘기이지만, 인공지능 학습 모델에는 정답이 없고
정답에 근사하게 만들어 나가는 것이 우리의 과제라고 생각합니다. (ㅠ_ㅠ)
그러나 일부 머신러닝 개발 프레임워크를 사용하는데 있어서
공통되는(?) 개념 정도는 공유가 가능하고 도움이 될 수도 있다는 생각에 글을 써봅니다.
크게 2가지 데이터를 기준으로 설명하려고 합니다.
# 사전에는 1~4 에 대한 index가 있다고 가정
data = [['b','e','a'],['c','a'],['a','d','c','c','b']]
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차원 데이터 를 다루겠습니다.
시계열 데이터 안에 존재하는 데이터들의 사전(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'}
앞서 만든 사전을 이용해 원본 데이터를 치환해 줍니다.
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, 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인 형태가 되었습니다.
데이터의 일부가 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)
아래와 같이 모델을 만들어 주었습니다.
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)
도움이 되셨다면 공감 클릭 부탁드립니다 :)
텐서플로우2(TensorFlow 2.x) 시계열 데이터 전처리 및 모델 입력 방법 2 (0) | 2021.02.01 |
---|---|
텐서플로우 dlerror cudart64_101.dll not found (0) | 2020.11.30 |
텐서플로우 JAVA 실행 오류 (5) | 2019.08.16 |
텐서플로우 not compiled to use: AVX AVX2 (0) | 2019.08.09 |
텐서플로우 inter_op_parallelism_threads (2) | 2019.08.09 |