CNN 구현하기
Python의 딥러닝 라이브러리인 Tensorflow를 사용하여 간단한 합성곱 신경망(CNN)을 구현하는 예제 코드입니다.
# 필요한 라이브러리 임포트
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()
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, Conv2D, MaxPooling2D: Dense, Flatten, Conv2D, MaxPooling2D 레이어를 사용하기 위해 tensorflow.keras.layers에서 필요한 클래스를 임포트합니다.
- from tensorflow.keras.datasets import mnist: MNIST 데이터셋을 로드하기 위해 tensorflow.keras.datasets에서 mnist를 임포트합니다.
- from tensorflow.keras.utils import to_categorical: 레이블 데이터를 one-hot 인코딩하기 위해 tensorflow.keras.utils에서 to_categorical 함수를 임포트합니다.
- import matplotlib.pyplot as plt: 학습 결과를 시각화하기 위해 matplotlib.pyplot에서 plt를 임포트합니다.
2. MNIST 데이터셋 로드
- (x_train, y_train), (x_test, y_test) = mnist.load_data(): MNIST 데이터셋을 다운로드하고 학습 데이터와 테스트 데이터로 분할합니다. x_train과 y_train은 학습 데이터와 레이블이고, x_test와 y_test는 테스트 데이터와 레이블입니다.
3. 데이터 전처리
- x_train = x_train.reshape(x_train.shape[0], 28, 28, 1): 학습 이미지를 CNN 모델에 맞게 4차원 배열로 변환합니다. (28, 28, 1) 형식은 이미지의 높이, 너비, 채널 수를 의미합니다.
- x_test = x_test.reshape(x_test.shape[0], 28, 28, 1): 테스트 이미지를 CNN 모델에 맞게 4차원 배열로 변환합니다.
- x_train = x_train.astype('float32') / 255: 학습 데이터를 float32 형식으로 변환하고, 각 픽셀 값을 0-1 범위로 정규화합니다.
- x_test = x_test.astype('float32') / 255: 테스트 데이터를 float32 형식으로 변환하고, 각 픽셀 값을 0-1 범위로 정규화합니다.
- y_train = to_categorical(y_train, 10): 학습 레이블을 one-hot 인코딩 형식으로 변환합니다. 10은 클래스 수를 나타냅니다.
- y_test = to_categorical(y_test, 10): 테스트 레이블을 one-hot 인코딩 형식으로 변환합니다.
4. 모델 생성
- model = Sequential(): Sequential 모델 객체를 생성합니다. Sequential 모델은 레이어를 순차적으로 쌓을 수 있는 모델입니다.
5. 첫 번째 합성곱 층
- model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1))):
- 32개의 필터를 사용하여 3x3 커널 크기의 첫 번째 Conv2D(합성곱) 레이어를 추가합니다.
- ReLU 활성화 함수를 사용합니다.
- 이 레이어는 입력 형태를 (28, 28, 1)로 받습니다.
- model.add(MaxPooling2D(pool_size=(2, 2))):
- 2x2 크기의 MaxPooling2D(최대 풀링) 레이어를 추가하여 합성곱 층의 출력 크기를 줄입니다.
6. 두 번째 합성곱 층
- model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')):
- 64개의 필터를 사용하여 3x3 커널 크기의 두 번째 Conv2D 레이어를 추가합니다.
- ReLU 활성화 함수를 사용합니다.
- model.add(MaxPooling2D(pool_size=(2, 2))):
- 2x2 크기의 MaxPooling2D 레이어를 추가하여 두 번째 합성곱 층의 출력 크기를 줄입니다.
7. 플래튼 층
- model.add(Flatten()):
- Flatten 레이어를 추가하여 다차원 배열을 1차원 배열로 변환합니다.
- 이는 Dense 레이어에 입력으로 사용됩니다.
8. 완전 연결 층
- model.add(Dense(128, activation='relu')):
- 128개의 뉴런을 가진 Dense 레이어(완전 연결 층)를 추가합니다.
- ReLU 활성화 함수를 사용합니다.
9. 출력 층
- model.add(Dense(10, activation='softmax')):
- 10개의 뉴런을 가진 Dense 출력 층을 추가합니다.
- Softmax 활성화 함수를 사용하여 클래스 확률을 출력합니다.
10. 모델 컴파일
- model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']): 모델을 컴파일합니다.
- 손실 함수로 categorical_crossentropy를 사용합니다.
- 최적화 함수로 Adam 옵티마이저를 사용합니다.
- 평가 지표로 정확도를 설정합니다.
11. 모델 학습
- history = model.fit(x_train, y_train, batch_size=128, epochs=10, validation_split=0.2): 모델을 학습시킵니다.
- 배치 크기는 128,
- 에포크 수는 10으로 설정하고,
- 학습 데이터의 20%를 검증 데이터로 사용합니다.
- 학습 과정의 기록은 history 객체에 저장됩니다.
12. 모델 평가
- score = model.evaluate(x_test, y_test): 테스트 데이터를 사용하여 모델을 평가합니다. 평가 결과를 score 변수에 저장하고, 테스트 손실과 정확도를 출력합니다.
- print('Test loss:', score[0]): 테스트 손실을 출력합니다.
- print('Test accuracy:', score[1]): 테스트 정확도를 출력합니다.
13. 학습 결과 시각화
- 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():
'개발 > AI' 카테고리의 다른 글
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 |
[프로젝트 #1] 카카오 번역 API (파이썬) (0) | 2022.05.31 |