딥러닝 이미지 학습 및 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 (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)
'Programming 개발은 구글로 > 기타 정보' 카테고리의 다른 글
[WEB+AI] 31일차 딥러닝 실습 (1) | 2024.11.25 |
---|---|
[WEB+AI] 30일차 딥러닝 + RNN (0) | 2024.11.22 |
[WEB+AI] 28일차 딥러닝 2/2 (0) | 2024.11.20 |
[WEB+AI] 27일차 딥러닝 1/2 (0) | 2024.11.19 |
[WEB+AI] 26일차 Orange 3 복습 (0) | 2024.11.18 |
댓글