CNN 활용하기
Python의 딥러닝 라이브러리인 Tensorflow를 사용하여 간단한 합성곱 신경망(CNN)을 활용하는 예제 코드입니다.
CNN으로 학습하는 코드(아래 코드 Line1~Line67까지)에 대한 설명은 아래 주소를 참조하세요.
https://easyjwork.tistory.com/27
# 필요한 라이브러리 임포트
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
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.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 모델 생성
model = Sequential()
# 첫 번째 합성곱 층
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 두 번째 합성곱 층
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 플래튼 층
model.add(Flatten())
# 완전 연결 층
model.add(Dense(128, activation='relu'))
# 출력 층
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=10, 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'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper left')
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 변수는 길이 8의 리스트)
- weights[0] = (3, 3, 1, 32) 크기의 가중치(weight) array
- weights[1] = (32) 크기의 편향(bias) array
- weights[2] = (3, 3, 32, 64) 크기의 가중치(weight) array
- weights[3] = (64) 크기의 편향(bias) array
- weights[4] = (1600, 128) 크기의 가중치(weight) array
- weights[5] = (128) 크기의 편향(bias) array
- weights[6] = (128, 10) 크기의 가중치(weight) array
- weights[7] = (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를 이용하여 구현한 RNN 활용하기 (0) | 2024.07.10 |
---|---|
Python과 Tensorflow를 이용하여 RNN 구현하기 (0) | 2024.07.10 |
Python과 Tensorflow를 이용하여 CNN 구현하기 (0) | 2024.07.10 |
Python과 Tensorflow를 이용하여 구현한 DNN 활용하기 (0) | 2024.07.10 |
Python과 Tensorflow를 이용하여 DNN 구현하기 (0) | 2024.07.07 |