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(): 설정된 내용을 바탕으로 그래프를 화면에 표시합니다.
'개발 > AI' 카테고리의 다른 글
Python과 Tensorflow를 이용하여 CNN 구현하기 (0) | 2024.07.10 |
---|---|
Python과 Tensorflow를 이용하여 구현한 DNN 활용하기 (0) | 2024.07.10 |
[프로젝트 #1] 카카오 번역 API (파이썬) (0) | 2022.05.31 |
[프로젝트 #1] 구글 번역 API (파이썬) (0) | 2022.05.31 |
[프로젝트 #1] 파파고 번역 API (파이썬) (0) | 2022.05.31 |