DNN 활용하기
Python의 딥러닝 라이브러리인 Keras를 사용하여 간단한 심층신경망(DNN)을 활용하는 예제 코드입니다.
DNN으로 학습하는 코드(아래 코드 Line1~Line53까지)에 대한 설명은 아래 주소를 참조하세요.
https://easyjwork.tistory.com/25
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을 나타낸다고 예측한 것입니다.
'개발 > AI' 카테고리의 다른 글
Python과 Tensorflow를 이용하여 구현한 CNN 활용하기 (0) | 2024.07.10 |
---|---|
Python과 Tensorflow를 이용하여 CNN 구현하기 (0) | 2024.07.10 |
Python과 Tensorflow를 이용하여 DNN 구현하기 (0) | 2024.07.07 |
[프로젝트 #1] 카카오 번역 API (파이썬) (0) | 2022.05.31 |
[프로젝트 #1] 구글 번역 API (파이썬) (0) | 2022.05.31 |