본문 바로가기
개발/AI

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

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

 

DNN 활용하기

 

 

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

 

DNN으로 학습하는 코드(아래 코드 Line1~Line53까지)에 대한 설명은 아래 주소를 참조하세요.

https://easyjwork.tistory.com/25

 

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

DNN 구현하기  Python의 딥러닝 라이브러리인 Keras를 사용하여 간단한 심층신경망(DNN)을 구현하는 예제 코드입니다. # 필요한 라이브러리 임포트import tensorflow as tffrom tensorflow.keras.models import Sequent

easyjwork.tistory.com

 

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
import numpy as np

# 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()

# 모델 저장
model.save('./mnist_model.h5')

# 저장된 모델 불러오기
loaded_model = tf.keras.models.load_model('./mnist_model.h5')

# 모델 아키텍처 확인
loaded_model.summary()

# 모델 컴파일 정보 확인
print("Optimizer:", loaded_model.optimizer)
print("Loss function:", loaded_model.loss)
print("Metrics:", loaded_model.metrics_names)

# 모델의 가중치 확인
weights = loaded_model.get_weights()
print("Model weights:", weights)

# 불러온 모델을 사용하여 예측
predictions = loaded_model.predict(x_test)

# 예측 결과 확인 (예: 첫 번째 테스트 이미지의 예측 결과)
print(predictions[0])  # softmax 출력
print(np.argmax(predictions[0]))  # 예측된 클래스

 

 

1. 모델 저장

- model.save('./mnist_model.h5'): 현재 학습된 모델을 HDF5 파일 포맷으로 저장합니다. 이 파일에는 다음 정보가 포함됩니다.

  • 모델의 아키텍처 (레이어 구조)
  • 모델의 가중치
  • 컴파일 정보 (optimizer, loss, metrics)
  • 모델의 학습 상태 (모든 epoch에 대한 학습 상태)

 

 

2. 저장된 모델 불러오기

- loaded_model = tf.keras.models.load_model('mnist_model.h5'): 저장된 모델 파일을 불러옵니다.

  • 이 함수는 모델 아키텍처, 가중치, 컴파일 정보 및 학습 상태를 모두 복원합니다.
  • loaded_model 변수에 복원된 모델이 할당됩니다.

 

 

3. 모델 아키텍처 확인

- loaded_model.summary(): 모델의 레이어와 각 레이어의 출력 형태, 파라미터 수 등을 출력합니다.

 

 

4. 모델 컴파일 정보 확인

- print(loaded_model.optimizer): Optimizer 정보 확인 (위 코드에서는 keras.optimizer_v2.adam.Adam를 의미함)

- print(loaded_model.loss): Loss 함수 정보 확인 (위 코드에서는 function categorical_crossentropy를 의미함)

- print(loaded_model.metrics_names): Metrics 정보 확인 (위 코드에서는 ['loss', 'accuracy']를 의미함)

 

 

5. 모델의 가중치 확인

- weights = loaded_model.get_weights(): 모델의 학습 상태는 주로 모델의 가중치나 특정 레이어의 가중치, 편향을 확인하여 확인할 수 있습니다. 이를 위해 get_weights() 메서드를 사용합니다. (weights 변수는 길이 6의 리스트)

  • weights[0] = (784, 128) 크기의 가중치(weight) array
  • weights[1] = (128) 크기의 편향(bias) array
  • weights[2] = (128, 64) 크기의 가중치(weight) array
  • weights[3] = (64) 크기의 편향(bias) array
  • weights[4] = (64, 10) 크기의 가중치(weight) array
  • weights[5] = (10) 크기의 편향(bias) array

 

 

6. 불러온 모델을 사용하여 예측

- predictions = loaded_model.predict(x_test): 불러온 모델을 사용하여 x_test 데이터에 대한 예측을 수행합니다.

  • 이 반환 값은 softmax 활성화 함수를 사용한 출력값으로, 각 클래스에 대한 확률 분포를 나타냅니다.

 

 

7. 예측 결과 확인 (예: 첫 번째 테스트 이미지의 예측 결과)

- print(predictions[0]): 첫 번째 테스트 이미지에 대한 예측 결과를 의미합니다.

  • 이 결과는 10개의 확률값으로 이루어진 배열로, 각 확률값은 해당 클래스일 확률을 나타냅니다.

- print(np.argmax(predictions[0])): 이 확률값 중 가장 큰 값의 인덱스를 반환합니다.

  • 이 인덱스는 모델이 예측한 클래스(숫자 0-9 중 하나)를 나타냅니다.
  • 예를 들어, 첫 번째 테스트 이미지에 대한 예측 결과가 predictions[0]에서 가장 큰 값이 인덱스 7에 있다면, 모델은 이 이미지가 숫자 7을 나타낸다고 예측한 것입니다.

 

반응형