CNN Models
강사: 이숙번님
1. CNN Models
1.1. LeNet5 - 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)
# 원핫인코딩
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
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)
(50000, 32, 32, 3) (50000, 10)
(10000, 32, 32, 3) (10000, 10)
X = tf.keras.layers.Input(shape=[32,32,3])
H = tf.keras.layers.Conv2D(6, kernel_size=5, activation='relu')(X)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='relu')(H)
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.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer = "adam")
model.summary()
# 결과
model.fit(x_train, y_train, epochs=20, validation_split=0.2)
model.evaluate(x_test, y_test)
# 결과
...
1.2. AlexNet
: ILSVRC의 Winner가 된 CNN 최초의 모델
- 두 개의 GPU를 활용한 병렬구조로 이루어 짐.
- relu 사용
- batch normalize
- lrn - local response normalization
1.3. Overfitting
: 훈련 데이터에 특화된 학습을 하게 되어 새로운 데이터에 대한 예측이 오히려 나빠지거나 학습의 효과가 나타나지 않는 상태
- overfitting 해결
- data augmentation
- dropout / Ensemble
- l2 loss
- L1, L2 Regularization
1.4. Dropout
: 지정된 확률의 개수만큼 노드를 랜덤하게 제외하고 학습을 진행.
- 완성된 모델에서는 모든 노드를 사용
- 효과
- 오버피팅 방지
- 성능 향상
- 앙상블 효과
- 학습이 된다면 최대한 높게 줄수록 좋다. 데이터가 충분하면 0.4 ~ 0.6
X = tf.keras.layers.Input(shape=[32,32,3])
H = tf.keras.layers.Conv2D(6, kernel_size=5, activation='relu')(X)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='relu')(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dropout(0.3)(H) # Dropout 추가, 30%를 랜덤하게 0으로...
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.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer = "adam")
model.summary()
1.5. Batch Normalization
: Layer 사이에 중간 결과 데이터들을 표준정규화하는 계층
-
- Internal Covariant Shift 문제를 해결
※ Normalization: 큰 값으로 인해 분포가 다르게 나타나는 것(학습에 방해가 됨)을 정규화 시킴.
- 수식
X = tf.keras.layers.Input(shape=[32,32,3])
H = tf.keras.layers.Conv2D(6, kernel_size=5, activation='relu')(X)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5, activation='relu')(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dense(120, activation='relu')(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dense(84, activation='relu')(H)
H = tf.keras.layers.BatchNormalization()(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer = "adam")
model.summary()
# 결과
model.fit(x_train, y_train, epochs=20, validation_split=0.2)
model.evaluate(x_test, y_test)
# 결과
...
- Batch Normalization 최적의 위치
: 적절한 위치는 activation 앞
X = tf.keras.layers.Input(shape=[32,32,3])
H = tf.keras.layers.Conv2D(6, kernel_size=5)(X)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('relu')(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('relu')(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(120)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('relu')(H)
H = tf.keras.layers.Dense(84)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation('relu')(H)
Y = tf.keras.layers.Dense(10, activation='softmax')(H)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer = "adam")
model.summary()
# 결과
model.fit(x_train, y_train, epochs=20, validation_split=0.2)
model.evaluate(x_test, y_test)
# 결과
...
- Ensemble
: 여러 개의 모델을 결합하여 하나의 강력한 모델을 만드는 방법을 의미함.
- 여러 모델(weak learners 또는 base models)의 예측을 결합하면, 단일 모델보다 일반화 성능이 개선될 가능성이 높음.
- 노이즈, 편향, 분산을 줄이고 예측의 안정성을 높이는 데 도움.
- 여러 모델이 제안하는 대체값의 평균 또는 다수결을 통해 결측치를 보완함.
1.6. Data Augmentation
: 랜덤한 값을 추가해 줌으로써 학습 속도는 줄어들지만, Overfitting을 방지함.
- 이미지 증강 - 이미지를 랜덤하게 조정해서 사용
import tensorflow as tf
# 1. CIFAR-10 데이터 로드
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
# Normalize the images - 0~1 사이의 float으로 바꿈.
# 이미지 노멀라이즈를 하지 않으면 결과가 안 나옴.
x_train = x_train / 255.0
x_test = x_test / 255.0
# 2. 데이터 증강 설정
X = tf.keras.layers.Input(shape=[32, 32, 3])
H = tf.keras.layers.RandomFlip("horizontal")(X) # 수평 반전
H = tf.keras.layers.RandomRotation(0.1)(H) # 작은 각도로 회전
Y = tf.keras.layers.RandomZoom(0.1)(H) # 약간의 줌 인/아웃
augment = tf.keras.Model(X, Y)
augment.summary()
# 결과
import matplotlib.pyplot as plt
augmented = augment(x_train[0:1])
plt.imshow(augmented[0])
# 결과(Random하게 수평 반전, 회전, 줌 인/아웃 됨)
- 이미지 증강 학습
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)
# 원핫인코딩
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
X = tf.keras.Input(shape=[32, 32, 3])
H = tf.keras.layers.RandomFlip("horizontal")(X) # 수평 반전
H = tf.keras.layers.RandomRotation(0.1)(H) # 작은 각도로 회전
H = tf.keras.layers.RandomZoom(0.1)(H) # 약간의 줌 인/아웃
H = tf.keras.layers.Conv2D(6, kernel_size=5, activation="relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5, activation="relu")(H)
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"],
optimizer="adam")
model.summary()
# 결과
- 3가지 기법 활용 모델
X = tf.keras.Input(shape=[32, 32, 3])
H = tf.keras.layers.RandomFlip("horizontal")(X) # 수평 반전
H = tf.keras.layers.RandomRotation(0.1)(H) # 작은 각도로 회전
H = tf.keras.layers.RandomZoom(0.1)(H) # 약간의 줌 인/아웃
H = tf.keras.layers.Conv2D(6, kernel_size=5)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation("relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(16, kernel_size=5)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation("relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dropout(0.4)(H)
H = tf.keras.layers.Dense(120)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation("relu")(H)
H = tf.keras.layers.Dense(84)(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.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"],
optimizer="adam")
model.summary()
# 결과
1.7. VGG
: 3x3 convolution, stride 1 활용
import tensorflow as tf
# 1. CIFAR-10 데이터 로드
(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)
# 이미지 노멀라이즈 - 0~1 사이의 float으로 바꿈.
x_train = x_train / 255.0
x_test = x_test / 255.0
# 원핫인코딩
y_train = tf.keras.utils.to_categorical(y_train)
y_test = tf.keras.utils.to_categorical(y_test)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
X = tf.keras.Input(shape=[32, 32, 3])
H = tf.keras.layers.Conv2D(64, kernel_size=3, padding="same", activation="relu")(X)
H = tf.keras.layers.Conv2D(64, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(128, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.Conv2D(128, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(256, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.Conv2D(256, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(512, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.Conv2D(512, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Conv2D(512, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.Conv2D(512, kernel_size=3, padding="same", activation="relu")(H)
H = tf.keras.layers.MaxPool2D()(H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(4096, activation="relu")(H)
H = tf.keras.layers.Dense(4096, activation="relu")(H)
H = tf.keras.layers.Dense(1000, 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"],
optimizer="adam")
model.summary()
# 결과
1.8. early stopping
: overfitting이 발생하면 멈추고 멈추기 전 최적의 모델을 적용
- Early Stopping의 개념
- 과적합 방지:
- 모델이 훈련 데이터를 너무 잘 학습하여 테스트 데이터에서의 성능이 떨어지는 현상을 방지.
- 학습 도중 검증 데이터(validation set)의 성능이 더 이상 개선되지 않는 시점에서 학습을 중단.
- 효율성 향상:
- 불필요하게 많은 에포크(epoch) 동안 학습하지 않도록 하여 시간과 자원을 절약.
early = tf.keras.callbacks.EarlyStopping(patience=5, restore_best_weights=True)
model.fit(x_train, y_train, epochs=10000, validation_split=0.2, callbacks=[early])
model.evaluate(x_test, y_test)
- val_loss 값을 보며, 5번까지 해당 값(0.6355)보다 나아지지 않으면 멈춤.
- 모델 및 가중치 저장
model.save('my_model.h5')
- 모델 및 가중치 로딩
my_model = tf.keras.models.load_model('my_model.h5')
1.9. vgg_block 함수 이용
def vgg_block(n_filters, n_layers, H):
for _ in range(n_layers):
H = tf.keras.layers.Conv2D(n_filters, kernel_size=3, padding="same")(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Activation("relu")(H)
Y = tf.keras.layers.MaxPool2D()(H)
return Y
X = tf.keras.Input(shape=[32, 32, 3])
H = vgg_block(64, 2, X)
H = vgg_block(128, 2, H)
H = vgg_block(256, 2, H)
H = vgg_block(512, 2, H)
H = vgg_block(512, 2, H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dense(4096, activation="relu")(H)
H = tf.keras.layers.Dense(4096, activation="relu")(H)
H = tf.keras.layers.Dense(1000, 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"],
optimizer="adam")
model.summary()
- vgg19 모델
X = tf.keras.Input(shape=[32, 32, 3])
H = vgg_block(64, 2, X)
H = vgg_block(128, 2, H)
H = vgg_block(256, 4, H)
H = vgg_block(512, 4, H)
H = vgg_block(512, 4, H)
H = tf.keras.layers.Flatten()(H)
H = tf.keras.layers.Dropout(0.6)(H)
H = tf.keras.layers.Dense(4096, activation="relu")(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dense(4096, activation="relu")(H)
H = tf.keras.layers.BatchNormalization()(H)
H = tf.keras.layers.Dense(1000, activation="relu")(H)
H = tf.keras.layers.BatchNormalization()(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()
출처: AI Hub 교육과정 - WEB+AI (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)
'Programming 개발은 구글로 > 기타 정보' 카테고리의 다른 글
[WEB+AI] 32일차 딥러닝 GoogLeNet (0) | 2024.11.27 |
---|---|
[WEB+AI] 31일차 딥러닝 실습 (1) | 2024.11.25 |
[WEB+AI] 30일차 딥러닝 + RNN (0) | 2024.11.22 |
[WEB+AI] 29일차 딥러닝 이미지 학습 및 LeNet5 (1) | 2024.11.21 |
[WEB+AI] 28일차 딥러닝 2/2 (0) | 2024.11.20 |
댓글