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

[WEB+AI] 32일차 CNN Models

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

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

  : 지정된 확률의 개수만큼 노드를 랜덤하게 제외하고 학습을 진행.

 

  - 완성된 모델에서는 모든 노드를 사용

  • 효과 
    • 오버피팅 방지
    • 성능 향상
    • 앙상블 효과

 

 

< Standard Neural Net >

 

< After applying 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의 개념

  1. 과적합 방지:
    • 모델이 훈련 데이터를 너무 잘 학습하여 테스트 데이터에서의 성능이 떨어지는 현상을 방지.
    • 학습 도중 검증 데이터(validation set)의 성능이 더 이상 개선되지 않는 시점에서 학습을 중단.
  2. 효율성 향상:
    • 불필요하게 많은 에포크(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 (위 내용이 문제가 된다면 댓글에 남겨주세요. 바로 삭제조치하도록 하겠습니다.)

 

 

댓글