본문 바로가기
개발/AI

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

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

 

RNN 구현하기

 

 

Python의 딥러닝 라이브러리인 Tensorflow를 사용하여 간단한 순환 신경망(RNN)을 구현하는 예제 코드입니다.

 

# 필요한 라이브러리 임포트
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import SimpleRNN, Dense
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt

# 데이터셋 로드 및 전처리
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 데이터 정규화
x_train = x_train / 255.0
x_test = x_test / 255.0

# 라벨을 원-핫 인코딩
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

# RNN 모델 생성
model = Sequential()
model.add(SimpleRNN(128, input_shape=(28, 28)))
model.add(Dense(10, activation='softmax'))

# 모델 컴파일
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델 훈련
history = model.fit(x_train, y_train, batch_size=128, epochs=5, validation_split=0.2)

# 모델 평가
score = model.evaluate(x_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

# 결과 시각화
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

 

 

1. 필요한 라이브러리 임포트

- import tensorflow as tf: TensorFlow 라이브러리를 임포트합니다. (tensorflow version은 2.x)

- from tensorflow.keras.models import Sequential: Sequential 모델을 사용하기 위해 Keras의 models 모듈에서 Sequential 클래스를 임포트합니다.

- from tensorflow.keras.layers import SimpleRNN, Dense: RNN 층과 Dense 층을 사용하기 위해 Keras의 layers 모듈에서 SimpleRNN과 Dense 클래스를 임포트합니다.

- from tensorflow.keras.datasets import mnist: MNIST 데이터셋을 로드하기 위해 Keras의 datasets 모듈에서 mnist를 임포트합니다.

- from tensorflow.keras.utils import to_categorical: 라벨을 원-핫 인코딩하기 위해 Keras의 utils 모듈에서 to_categorical 함수를 임포트합니다.

- import matplotlib.pyplot as plt: 훈련 결과를 시각화하기 위해 matplotlib의 pyplot 모듈을 임포트합니다.

 


2. 데이터셋 로드 및 전처리

- (x_train, y_train), (x_test, y_test) = mnist.load_data(): MNIST 데이터셋을 로드하고, 훈련 데이터와 테스트 데이터를 변수에 저장합니다.

 


3. 데이터 정규화

- x_train = x_train / 255.0: 이미지 데이터를 0에서 1 사이의 값으로 정규화합니다.

- x_test = x_test / 255.0: 이미지 데이터를 0에서 1 사이의 값으로 정규화합니다. 

 


4. 라벨을 원-핫 인코딩

- y_train = to_categorical(y_train): 라벨 데이터를 원-핫 인코딩하여 다중 클래스 분류에 사용할 수 있도록 변환합니다.

- y_test = to_categorical(y_test): 라벨 데이터를 원-핫 인코딩하여 다중 클래스 분류에 사용할 수 있도록 변환합니다.

 


5. RNN 모델 생성

- model = Sequential(): Sequential 모델 객체를 생성합니다.

- model.add(SimpleRNN(128, input_shape=(28, 28))): 128개의 유닛을 가진 SimpleRNN 층을 모델에 추가하고, 입력 데이터의 형태를 (28, 28)로 설정합니다.

- model.add(Dense(10, activation='softmax')): 10개의 출력 유닛을 가진 Dense 층을 모델에 추가하고, 소프트맥스 활성화 함수를 사용하여 각 클래스에 대한 확률을 출력하도록 설정합니다.

* 아래는 생성된 RNN 모델의 행렬 연산 과정을 나타내며, [a, b]는 행렬의 행과 열의 크기를 의미합니다.

 


6. 모델 컴파일

- model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']): 모델을 컴파일합니다.

  • 손실 함수로 categorical_crossentropy를 사용합니다.
  • 최적화 함수로 Adam 옵티마이저를 사용합니다.
  • 평가 지표로 정확도를 설정합니다.

 


7. 모델 훈련

- history = model.fit(x_train, y_train, batch_size=128, epochs=5,  validation_split=0.2): 모델을 훈련합니다.

  • 배치 크기는 128,
  • 에포크 수는 5으로 설정하고,
  • 학습 데이터의 20%를 검증 데이터로 사용합니다.
  • 학습 과정의 기록은 history 객체에 저장됩니다.

 

 

8. 모델 평가
- score = model.evaluate(x_test, y_test): 테스트 데이터를 사용하여 모델을 평가합니다. 평가 결과를 score 변수에 저장하고, 테스트 손실과 정확도를 출력합니다.
- print('Test loss:', score[0]): 테스트 손실을 출력합니다.
- print('Test accuracy:', score[1]): 테스트 정확도를 출력합니다.

 


9. 결과 시각화

- plt.plot(history.history['accuracy'], label='accuracy'): 훈련 정확도 값을 플롯합니다.

- plt.plot(history.history['val_accuracy'], label='val_accuracy'): 검증 정확도 값을 플롯합니다.

- plt.xlabel('Epoch'): x축 레이블을 'Epoch'으로 설정합니다.

- plt.ylabel('Accuracy'): y축 레이블을 'Accuracy'로 설정합니다.

- plt.legend(): 그래프에 범례를 추가합니다.

- plt.show(): 그래프를 화면에 출력합니다.

 

반응형