본문 바로가기
개발/AI

Python과 Tensorflow를 이용하여 LSTM 구현하기

by 꾀돌이 개발자 2024. 7. 13.
반응형

 

LSTM 구현하기

 

 

Python의 딥러닝 라이브러리인 Tensorflow를 사용하여 간단한 장단기 메모리(LSTM)을 구현하는 예제 코드입니다.

 

# 필요한 라이브러리 임포트
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 임의의 시계열 데이터 생성 (사인파)
def generate_sin_wave(seq_length, num_sequences):
    x = np.linspace(0, 100, seq_length * num_sequences)
    y = np.sin(x)
    return y.reshape(num_sequences, seq_length, 1)

seq_length = 50  # 시퀀스 길이
num_sequences = 1000  # 시퀀스 개수
data = generate_sin_wave(seq_length, num_sequences)

# 데이터셋 분리
split = int(0.8 * num_sequences)
train_data = data[:split]
test_data = data[split:]

# 모델 구축
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(seq_length, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

# 모델 학습
X_train = train_data[:, :-1]
y_train = train_data[:, -1]
model.fit(X_train, y_train, epochs=20, verbose=1)

# 예측
X_test = test_data[:, :-1]
y_test = test_data[:, -1]
predictions = model.predict(X_test)

# 결과 시각화
plt.plot(y_test, label='True')
plt.plot(predictions, label='Predicted')
plt.legend()
plt.show()

 

 

1. 필요한 라이브러리 임포트
- import numpy as np: 배열 및 수학 함수와 관련된 작업을 수행하는 라이브러리입니다.
- import matplotlib.pyplot as plt: 데이터 시각화를 위한 라이브러리입니다.
- import tensorflow as tf: 딥러닝 및 머신러닝을 위한 라이브러리입니다. (tensorflow version은 2.x)
- from tensorflow.keras.models import Sequential: 텐서플로우 케라스 API의 시퀀셜 모델 클래스로, 층을 순차적으로 쌓아 모델을 구축할 때 사용됩니다.
- from tensorflow.keras.layers import LSTM, Dense: 장단기 메모리(LSTM) 층과 완전 연결 층(fully connected layer)을 구현하는 클래스입니다.

 

 

2. 임의의 시계열 데이터 생성 (사인파)
- def generate_sin_wave(seq_length, num_sequences): 임의의 사인파 시계열 데이터를 생성하는 함수입니다.

 

  • seq_length: 시퀀스의 길이(여기서는 50).
  • num_sequences: 시퀀스의 개수(여기서는 1000).

- x = np.linspace(0, 100, seq_length * num_sequences): 0부터 100까지 균일한 간격을 가진 seq_length * num_sequences 개의 점을 생성합니다.
- y = np.sin(x): 각 점의 사인 값을 계산하여 y 배열을 만듭니다.
- return y.reshape(num_sequences, seq_length, 1): y 배열을 (num_sequences, seq_length, 1) 형태로 재구성하여 반환합니다. 이는 LSTM 모델이 기대하는 입력 형식입니다.

 

- seq_length = 50:
- num_sequences = 1000:
- data = generate_sin_wave(seq_length, num_sequences): generate_sin_wave 함수를 호출하여 사인파 데이터를 생성하고, data 변수에 저장합니다.

 

 

3. 데이터셋 분리
- split = int(0.8 * num_sequences): 데이터셋을 훈련 세트와 테스트 세트로 나누기 위한 인덱스를 계산합니다. 전체 시퀀스 중 80%를 훈련 세트로 사용합니다.
- train_data = data[:split]: data 배열에서 처음부터 split 인덱스까지의 데이터를 훈련 세트로 설정합니다.
- test_data = data[split:]: data 배열에서 split 인덱스부터 끝까지의 데이터를 테스트 세트로 설정합니다.

 

 

4. 모델 구축
- model = Sequential(): 시퀀셜 모델을 초기화합니다.
- model.add(LSTM(50, activation='relu', input_shape=(seq_length, 1))): LSTM 층을 추가합니다. 50개의 유닛을 사용하며, 활성화 함수로 ReLU를 사용하고, 입력 형식은 (seq_length, 1)입니다. 이는 50 길이의 시퀀스와 1개의 특성을 의미합니다.
- model.add(Dense(1)): 출력층으로 Dense 층을 추가하여 하나의 출력을 만듭니다.
- model.compile(optimizer='adam', loss='mse'): 모델을 컴파일합니다. 옵티마이저로 adam을 사용하고, 손실 함수로 평균 제곱 오차(MSE)를 사용합니다.

 

 

5. 모델 학습
- X_train = train_data[:, :-1]: train_data 배열에서 각 시퀀스의 마지막 값을 제외한 부분을 입력 데이터로 설정합니다.
- y_train = train_data[:, -1]: train_data 배열에서 각 시퀀스의 마지막 값을 타깃 데이터로 설정합니다.
- model.fit(X_train, y_train, epochs=20, verbose=1): 모델을 학습시킵니다. 20 에포크 동안 훈련하고, 진행 상황을 출력합니다.

 

 

6. 예측
- X_test = test_data[:, :-1]: test_data 배열에서 각 시퀀스의 마지막 값을 제외한 부분을 입력 데이터로 설정합니다.
- y_test = test_data[:, -1]: test_data 배열에서 각 시퀀스의 마지막 값을 타깃 데이터로 설정합니다.
- predictions = model.predict(X_test): 테스트 데이터를 사용하여 모델 예측을 수행하고, 결과를 predictions 변수에 저장합니다.

 

 

7. 결과 시각화
- plt.plot(y_test, label='True'): 실제 값을 플롯합니다. 라벨을 'True'로 설정하여 범례에 표시합니다.
- plt.plot(predictions, label='Predicted'): 예측 값을 플롯합니다. 라벨을 'Predicted'로 설정하여 범례에 표시합니다.
- plt.legend(): 범례를 추가합니다.
- plt.show(): 플롯을 화면에 표시합니다.

반응형