본문 바로가기
Programming 개발은 구글로/기타 정보

[WEB+AI] 29일차 딥러닝 이미지 학습 및 LeNet5

by 40대직장인 2024. 11. 21.

딥러닝 이미지 학습 및 LeNet5

 

강사: 이숙번님

 

 

 

 

1. 이미지 학습

 1.1. MNIST 이미지 분류기 모델  - Flatten 사용

  - before

import tensorflow as tf
import pandas as pd

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape, y_train.shape)

x_train = x_train.reshape(60000, 784)
# y_train = pd.get_dummies(y_train)
y_train = tf.keras.utils.to_categorical(y_train) # 텐서플로우의 원핫인코딩 함수.
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[784])
H = tf.keras.layers.Dense(128, activation="relu")(X)
H = tf.keras.layers.Dense(128, activation="relu")(H)
H = tf.keras.layers.Dense(128, activation="relu")(H)
Y = tf.keras.layers.Dense(10, activation="softmax")(H)
model = tf.keras.Model(X, Y)
model.compile(optimizer="adam",
              loss="categorical_crossentropy", metrics=["accuracy"])
model.summary()

model.fit(x_train, y_train, epochs=10)

 

 

  - after

import tensorflow as tf
import pandas as pd

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
print(x_train.shape, y_train.shape)
y_train = tf.keras.utils.to_categorical(y_train) # 텐서플로우의 원핫인코딩 함수.
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[28, 28])
H = tf.keras.layers.Flatten()(X) # Flatten 사용
H = tf.keras.layers.Dense(128, activation="relu")(H)
H = tf.keras.layers.Dense(128, activation="relu")(H)
H = tf.keras.layers.Dense(128, activation="relu")(H)
Y = tf.keras.layers.Dense(10, activation="softmax")(H)
model = tf.keras.Model(X, Y)
model.compile(optimizer="adam",
              loss="categorical_crossentropy", metrics=["accuracy"])
model.summary()

model.fit(x_train, y_train, epochs=10)

 

# 결과

 

 1.2. FashionMnist 예측하기

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)

# 결과
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)

 

import matplotlib.pyplot as plt

print(y_train[3])
plt.imshow(x_train[3], cmap="gray")
plt.show()

 

 

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()
print(x_train.shape, y_train.shape) 
y_train = tf.keras.utils.to_categorical(y_train) # 텐서플로우의 원핫인코딩 함수.
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[28, 28])
H = tf.keras.layers.Flatten()(X)
H = tf.keras.layers.Dense(120, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
Y = tf.keras.layers.Dense(10, activation="softmax")(H)  

model = tf.keras.Model(X, Y)
model.compile(optimizer="adam",
              loss="categorical_crossentropy", metrics=["accuracy"])
              
model.summary()

model.fit(x_train, y_train, epochs=10)

 

 

# 결과

 

 

  - 원핫인코딩 사용 이유

  • 신경망 모델은 숫자 레이블(정수)로 학습하기 어렵기 때문에 원핫인코딩을 통해 레이블을 벡터 형태로 변환함.
  • 다중 클래스 분류 문제에서 모델의 출력값과 비교하기 쉬워지고, 크로스 엔트로피 손실 함수와 같은 평가 함수도 사용할 수 있음.

 

 1.3. cifar10 예측하기

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)

# 결과
(50000, 32, 32, 3) (50000, 1)
(10000, 32, 32, 3) (10000, 1)

 

 

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
print(x_train.shape, y_train.shape)
y_train = tf.keras.utils.to_categorical(y_train) # 텐서플로우의 원핫인코딩 함수.
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[32, 32, 3])
H = tf.keras.layers.Flatten()(X)
H = tf.keras.layers.Dense(120, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
H = tf.keras.layers.Dense(84, activation="relu")(H)
Y = tf.keras.layers.Dense(10, activation="softmax")(H)  

model = tf.keras.Model(X, Y)
model.compile(optimizer="adam",
              loss="categorical_crossentropy", metrics=["accuracy"])
              
model.summary() 

model.fit(x_train, y_train, epochs=10)

 

 

# 결과

 

Danse layer 구조 = 완전 연결 층(Fully Connected Layer)

 

2. Convolution(Conv2D)

  : 특정한 패턴의 특징이 어디서 나타나는 지를 확인하는 도구

 

< 특정한 패턴(동그라미)이 어디에 위치하는지... >

 

 

 

 

 

  - 필터 하나당 특징맵 하나 생성

 

import tensorflow as tf
import pandas as pd

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 28, 28, 1) # 이미지를 2차원에서 3차원 형태로 reshape
y_train = pd.get_dummies(y_train)
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[28, 28, 1])
H = tf.keras.layers.Conv2D(3, kernel_size=5, activation='relu')(X) # 3채널의 특징맵
H = tf.keras.layers.Conv2D(6, kernel_size=5, activation='relu')(H) # 6채널의 특징맵
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(120, activation='relu')(H)
H = tf.keras.layers.Dense(84, activation='relu')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)

model = tf.keras.Model(X, Y)
model.compile(loss="categorical_crossentropy", metrics=["accuracy"])

model.summary() 

model.fit(x_train, y_train, epochs=10)

 

 

# 결과

 

 

  - 특징 자동 추출기

 

  • 흑백이기 때문에 1개의 채널만 존재
  • 필터 하나는 입력 특징맵 전체를 보고 특징맵 하나를 만든다.
  • 출력 크기(24) = 입력 크기(28) - 필터 크기(5) + 1,  (입력 크기 28 x 28, 필터 크기 5 x 5) 

 

 

 

3. MaxPooling

 

import tensorflow as tf
import pandas as pd

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 28, 28, 1)
y_train = pd.get_dummies(y_train)
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[28, 28, 1])
H = tf.keras.layers.Conv2D(3, kernel_size=5, activation='relu')(X) # 3채널의 특징맵
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(6, kernel_size=5, activation='relu')(H) # 6채널의 특징맵
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(120, activation='relu')(H)
H = tf.keras.layers.Dense(84, activation='relu')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)

model = tf.keras.Model(X, Y)
model.compile(loss="categorical_crossentropy", metrics=["accuracy"])

model.summary() 

model.fit(x_train, y_train, epochs=10)

 

 

# 결과

 

  • 기존 299,668 params -> 23,188 params로 변경됨.

 

 

4. LeNet5

  : Convolutional Neural Network(CNN) 아키텍처 중 하나로 주로 손글씨 숫자 인식(MNIST 데이터셋)에 사용되며, 딥러닝 기반 이미지 분류의 기초를 제공함.

 

 

import tensorflow as tf
import pandas as pd

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 28, 28, 1)
y_train = pd.get_dummies(y_train)
print(x_train.shape, y_train.shape)

X = tf.keras.Input(shape=[28, 28, 1])
H = tf.keras.layers.Conv2D(6, kernel_size=5, padding = 'same', activation='relu')(X) # 3채널의 특징맵
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='relu')(H) # 6채널의 특징맵
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(120, activation='relu')(H)
H = tf.keras.layers.Dense(84, activation='relu')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)

model = tf.keras.Model(X, Y)
model.compile(optimizer="adam",
    loss="categorical_crossentropy", metrics=["accuracy"])

model.summary() 

model.fit(x_train, y_train, epochs=10)

 

 

# 결과

 

  • padding = 'same' : 이미지 사이즈 유지

 

  - 해당 학습 모델을 사용할 수 있는 지 Test

x_test =  x_test.reshape(10000, 28, 28, 1)
y_test = pd.get_dummies(y_test)
...
model.evaluate(x_test, y_test)

 

 

5. Train / Validation / Test

  : 머신러닝 모델을 훈련하고 평가하기 위해 데이터를 나누는 방식입니다.


1. Train Set (훈련 데이터)

  • 역할: 모델을 학습시키는 데 사용되는 데이터입니다.
  • 목적: 모델이 입력 데이터와 해당 레이블(정답)의 관계를 학습하도록 도움.
  • 특징:
    • 모델의 가중치와 편향 같은 파라미터를 업데이트하기 위해 사용.
    • 데이터가 충분히 많을수록 모델이 더 잘 학습할 가능성이 높아짐.

예시:

  • MNIST 데이터셋에서 Train Set은 손글씨 이미지(입력)와 숫자 레이블(출력)을 제공하여 모델이 "0"과 "1"의 차이를 배우도록 만듦.

2. Validation Set (검증 데이터)

  • 역할: 학습 중에 모델의 성능을 점검하기 위해 사용.
  • 목적:
    • 모델이 학습 데이터에 과적합(overfitting)되고 있는지 확인.
    • 하이퍼파라미터(예: 학습률, 레이어 수, 노드 수 등)를 튜닝할 때 활용.
  • 특징:
    • 훈련 데이터와 독립적으로 사용되지만, 모델이 학습 과정에서 접근할 수 있음.
    • 학습 중에 검증 데이터의 정확도를 확인하여 모델 개선에 도움.

예시:

  • 훈련 도중, Validation Set으로 정확도를 확인하면서 과적합이 발생하면 조기 종료(Early Stopping)를 할 수 있음.

3. Test Set (테스트 데이터)

  • 역할: 최종적으로 모델의 성능을 평가하기 위해 사용.
  • 목적:
    • 학습하지 않은 새로운 데이터에서 모델이 얼마나 잘 작동하는지 확인.
    • 모델의 일반화 능력(generalization)을 측정.
  • 특징:
    • 훈련 및 검증 데이터와 완전히 분리된 데이터로 구성.
    • 모델 학습이 끝난 후에만 사용.
    • 과적합 여부를 최종적으로 평가.

예시:

  • MNIST 데이터셋에서, Test Set을 사용해 학습을 마친 모델이 새 이미지를 얼마나 정확히 분류하는지 평가.

 

※ 데이터 분할 비율

  • 일반적으로 데이터를 다음 비율로 나눕니다:
    • Train Set: 70~80%
    • Validation Set: 10~15%
    • Test Set: 10~15%

 

model.fit(x_train, y_train, epochs=10, validation_split=0.2)

 

 


출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)

 

 

댓글