내가 하고싶은 건 다 하는 공간
혼자 만들면서 공부하는 딥러닝 1-3 패션 상품 이미지 분류하기: LeNet-5 모델 훈련 및 검증 본문
LeNet5 모델
혼자 만들면서 공부하는 딥러닝 1-3 패션 상품 이미지 분류하기: 활성화 함수, LeNet-5 모델 만들기
들어가기에 앞서..지난주에 1주차를 마쳤는데 제 글이 혼공학습단 홈페이지 최상단에서 떠나질 않아요..혼공족장님께서 극찬을 해주셨어요. 덕분에 부담 백배라서 2주차도 어김없이 하러 왔습
kmina02.tistory.com
LeNet5 모델에 대한 내용은 이전 글 참고.
훈련 데이터 준비하기
10가지의 패션 아이템 이미지를 포함하는 패션 MNIST 데이터셋을 이용합니다. 각 데이터는 28*28 픽셀의 패션 아이템 사진이고, 6만 개의 훈련 세트와 1만 개의 테스트 세트가 있습니다.
🟦 책에 없는 코드: 모든 카테고리의 패션 아이템 확인
🟦 책에 없는 코드: 마지막 차원에 1을 추가하는 이유
# 책에 없는 코드: 마지막 차원에 1을 추가하는 이유
print("변경 전")
print(train_input[0].shape)
print(min(list(train_input[0][i].max() for i in range(28)))) # 기존 train_input은 0~255 사이의 흑백 강도를 나타내는 값들로 이루어짐
print(max(list(train_input[0][i].max() for i in range(28))))
# 신경망은 0 ~ 1 혹은 -1 ~ 1 사이의 값에서 잘 동작ㅁ
train_input = train_input.reshape(-1, 28, 28, 1) / 255.0 # 마지막 차원에 1 추가
print("변경 후")
print(train_input[0].shape)
print(min(list(train_input[0][i].max() for i in range(28)))) # 변경된 train_input은 0~1 사이의 흑백 강도를 나타내는 값들로 이루어짐
print(max(list(train_input[0][i].max() for i in range(28))))
패션 MNIST 데이터의 차원 변경
전: (이미지 개수, 높이, 너비) = (-1, 28, 28)
후: (이미지 개수, 높이, 너비, 차원) = (-1, 28, 28, 1) * 흑백의 경우 채널이 1이므로 마지막 차원에 1을 추가하여 형태를 변경
이미지 개수는 모르니까 -1로 설정해서 자동으로 계산하도록 합니다.
기존에는 0~255 사이의 값으로 이루어졌지만, 0~1 사이의 값으로 바꿔주기 위해 255로 나눠줍니다.
모델 세팅하기
검증 세트도 만들어주고, 콜백과 손실함수도 정의해줬습니다.
두 콜백은 1) 최적의 모델을 자동으로 저장하고 2) 두 번의 에포크동안 성능이 개선되지 않으면 훈련을 조기종료합니다. 참고로 다중분류에서는 sparse_categorical_crossentropy를, 이중분류에서는 categorical_crossentropy를 사용합니다.
훈련하기
훈련 세트, 검증 세트를 이용해서 모델을 훈련해줍니다. 이전에 콜백 2개를 만들어줬기 때문에 두 번의 에포크동안 성능이 개선되지 않았다면 자동으로 종료합니다.
모델 성능 확인하기
모델은 accuracy가 높을수록, loss가 작을수록 좋은 모델이라고 할 수 있습니다. epochs에 따른 accuracy, loss값을 꺾은선 그래프로 시각화하여 어느 지점에서 accuracy와 loss의 변화가 미미한지 살펴봅니다. 16번째 에포크 이후로 변화가 미미한 것 같습니다.
# 모델 성능 확인
epochs = range(1, len(hist.history["loss"]) + 1)
fig, axs = plt.subplots(1, 2, figsize = (12, 4))
axs[0].plot(epochs, hist.history["loss"], label = "train_loss")
axs[0].plot(epochs, hist.history["val_loss"], label = "val_loss")
axs[0].set_xticks(epochs)
axs[0].set_xlabel("epochs")
axs[0].set_ylabel("loss")
axs[0].legend()
axs[1].plot(epochs, hist.history["accuracy"], label = "train_acc")
axs[1].plot(epochs, hist.history["val_accuracy"], label = "val_acc")
axs[1].set_xticks(epochs)
axs[1].set_xlabel("epochs")
axs[1].set_ylabel("accuracy")
axs[1].legend()
plt.show()
다음 장에서는 예측이 잘못된 데이터를 살펴보겠습니다:)
'인공지능' 카테고리의 다른 글
혼자 만들면서 공부하는 딥러닝 2-1 이미지 분류 CNN 모델: AlexNet 모델 구조 분석하기 (0) | 2025.07.20 |
---|---|
혼자 만들면서 공부하는 딥러닝 1-3 패션 상품 이미지 분류하기: 잘못 분류된 데이터 살펴보기 (2) | 2025.07.13 |
혼자 만들면서 공부하는 딥러닝 1-3 패션 상품 이미지 분류하기: 활성화 함수, LeNet-5 모델 만들기 (4) | 2025.07.12 |
혼자 만들면서 공부하는 딥러닝 1-2 합성곱 신경망(CNN) 모델 이해하기: 풀링층과 밀집층 (1) | 2025.07.05 |
혼자 만들면서 공부하는 딥러닝 1-2 합성곱 신경망(CNN) 모델 이해하기: 합성곱층 Conv2D (1) | 2025.07.05 |