본문 바로가기
개발/AI

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

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

 

DNN 구현하기

 

 

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

 

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

# MNIST 데이터셋 로드
(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)

# 모델 정의
model = Sequential([
    Flatten(input_shape=(28, 28)),  # 입력층
    Dense(128, activation='relu'),  # 첫 번째 은닉층
    Dense(64, activation='relu'),   # 두 번째 은닉층
    Dense(10, activation='softmax') # 출력층
])

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

# 모델 학습
history = model.fit(
    x_train, y_train, 
    epochs=10, 
    batch_size=32, 
    validation_split=0.2, 
    verbose=1
)

# 모델 평가
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'Test accuracy: {test_acc}')

# 학습 및 검증 정확도 변화 시각화
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend(loc='lower right')
plt.title('Accuracy vs Epochs')
plt.show()

 

 

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

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

- from tensorflow.keras.models import Sequential: Keras의 Sequential 모델 클래스를 임포트합니다.

- from tensorflow.keras.layers import Dense, Flatten: Dense 층과 Flatten 층을 임포트합니다.

- from tensorflow.keras.datasets import mnist: Keras의 내장 데이터셋인 MNIST 데이터셋을 임포트합니다.

- from tensorflow.keras.utils import to_categorical: 레이블을 원-핫 인코딩으로 변환하는 유틸리티 함수를 임포트합니  다.

- import matplotlib.pyplot as plt: matplotlib 라이브러리를 plt라는 이름으로 임포트합니다.

 

 

2. MNIST 데이터셋 로드

- mnist.load_data(): MNIST 데이터셋을 로드합니다. (x_train, y_train)은 훈련 데이터와 레이블, (x_test, y_test)는 테스  트 데이터와 레이블을 의미합니다.

 

 

3. 데이터 전처리

- x_train = x_train / 255.0: 훈련 데이터의 픽셀 값을 0~1 범위로 정규화합니다.

- x_test = x_test / 255.0: 테스트 데이터의 픽셀 값을 0~1 범위로 정규화합니다. (x_train과 x_test는 0~255 범위의 값으로 구성된 array)

- y_train = to_categorical(y_train): 훈련 데이터의 레이블을 원-핫 인코딩 형식으로 변환합니다.

- y_test = to_categorical(y_test): 테스트 데이터의 레이블을 원-핫 인코딩 형식으로 변환합니다.

* 원-핫 인코딩 예 1: [0, 1, 2, 3] -> [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0.], [0, 0, 0, 1]] 로 변환

* 원-핫 인코딩 예 1: [0, 1, 2, 3] -> [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0.], [0, 0, 0, 1]] 로 변환

 

 

4. 모델 정의

- model = Sequential([ ... ]): Sequential 모델을 생성하고 각 층을 차례로 추가합니다.

  • Flatten(input_shape=(28, 28)): 입력 이미지를 1차원 벡터로 변환합니다. 입력 이미지의 형상은 (28, 28)입니다.
  • Dense(128, activation='relu'): 첫 번째 은닉층을 정의합니다. 이 층은 128개의 노드를 가지고 있고, ReLU 활성화 함수를 사용합니다.
  • Dense(64, activation='relu'): 두 번째 은닉층을 정의합니다. 이 층은 64개의 노드를 가지고 있고, ReLU 활성화 함수를 사용합니다.
  •  Dense(10, activation='softmax'): 출력층을 정의합니다. 이 층은 10개의 노드를 가지고 있으며, Softmax 활성화 함수를 사용합니다. 이는 다중 클래스 분류 문제에 적합합니다.

 

 

5. 모델 컴파일

- model.compile(): 모델을 컴파일합니다.

  • optimizer='adam': Adam 옵티마이저를 사용합니다. (현재 가장 범용적으로 사용하는 최적화함수)
  • loss='categorical_crossentropy': 손실 함수로 categorical crossentropy를 사용합니다. 이는 다중 클래스 분류(개와 고양이 분류 분제 같은) 문제에 적합합니다.
  • metrics=['accuracy']: 평가 지표로 정확도를 사용합니다.

 

 

6. 모델 학습

- history = model.fit(): 모델을 훈련시킵니다.

  • x_train, y_train: 훈련 데이터와 레이블입니다.
  • epochs=10: 전체 데이터셋에 대해 10번 반복 훈련합니다.
  • batch_size=32: 한 번에 32개의 샘플을 사용하여 모델을 업데이트합니다. (매 epoch마다 모든 데이터를 훈련하는 것은 비효율적)
  • validation_split=0.2: 훈련 데이터의 20%를 검증 데이터로 사용합니다. (훈련한 데이터로 평가하기 보다는 훈련에 사용하지 않은 데이터로 평가하기 위함)
  • verbose=1: 학습 과정 중 출력되는 로그의 상세 수준을 제어합니다. (0: 출력없음, 1: 진행 상황 표시(로딩바 포함), 2: 진행 상황 표시(로딩바 미포함))

 

 

7. 모델 평가

- test_loss, test_acc = model.evaluate(): 테스트 데이터로 모델을 평가합니다.

  • x_test, y_test: 테스트 데이터와 레이블입니다.

- print(f'Test accuracy: {test_acc}'): 테스트 데이터에 대한 모델의 정확도를 출력합니다.

 

 

8. 학습 및 검증 정확도 변화 시각화

- plt.plot(): 함수를 사용하여 그래프를 그립니다.

  • history.history['accuracy']: 에포크(epoch)별 훈련 정확도(Training Accuracy) 값을 리스트로 포함합니다.
  • label='Training Accuracy': 그래프의 범례(legend)로 사용할 라벨을 설정합니다.

- plt.plot(): 함수를 사용하여 그래프를 그립니다.

  • history.history['val_accuracy']: 에포크(epoch)별 검증 정확도(Validation Accuracy) 값을 리스트로 포함합니다.
  • label='Validation Accuracy': 그래프의 범례(legend)로 사용할 라벨을 설정합니다.

- plt.xlabel('Epoch'): x축의 라벨을 'Epoch'으로 설정합니다.

- plt.ylabel('Accuracy'): y축의 라벨을 'Accuracy'로 설정합니다.

- plt.legend(loc='lower right'): 범례를 그래프의 오른쪽 하단에 위치시킵니다.

- plt.title('Accuracy vs Epochs'): 그래프의 제목을 'Accuracy vs Epochs'로 설정합니다.

- plt.show(): 설정된 내용을 바탕으로 그래프를 화면에 표시합니다.

 

반응형