갬미의 성장일기

텐서플로우 개발자 자격증 준비하기 [3] - CV (Course 2) 본문

Deep Learning/Tensorflow cert

텐서플로우 개발자 자격증 준비하기 [3] - CV (Course 2)

갬미 2021. 11. 29. 23:36

두번째 코스에서는 Computer vision에 대해 학습합니다. assignment 기준 다음 순서로 학습이 진행됩니다.

1주차: CNN modeling
2주차: Data Augmentation
3주차: Inception v3 model trainfer learning 
4주차: Multiclass classification 

 

CNN modeling with Data augmentation (+binary class, Multiclass classification)

course2 week4 assignment 발췌

data: 가위바위보 손 모양 데이터 = multi class classification

# Create an ImageDataGenerator and do Image Augmentation
train_datagen = ImageDataGenerator(rescale=1. / 255.,
                                   rotation_range=40,
                                   width_shift_range=0.2,
                                   height_shift_range=0.2,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True,
                                   fill_mode='nearest')

validation_datagen = ImageDataGenerator(rescale=1. / 255.)

train_data = train_datagen.flow(training_images, training_labels, batch_size=32)
val_data = validation_datagen.flow(testing_images, testing_labels, batch_size=32)

# Define the model
model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dense(26, activation=tf.nn.softmax)
])

# Compile Model.
model.compile(optimizer=tf.optimizers.Adam(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) 
# Train the Model
history = model.fit(train_data, steps_per_epoch=len(training_images) / 32,
                              epochs=2,
                              validation_data=val_data,
                              validation_steps=len(testing_images) / 32)
model.save("rps.h5")

Image Augmentation(이미지 증식) - ImageDataGenerator 사용

- 이미지 증식은 데이터를 뒤집거나, 각도를 틀어 기존 이미지데이터가 가지지 못한 특징을 만들어 내는 역할을 합니다.

- 더 general 한 모델을 만들기 위해 사용

- 이를 적용할 경우 오버피팅 가능성이 줄고 이미지를 증식하여 저장하는것이 아닌 학습에 사용 하는것으로 메모리 사용량을 줄일 수 있습니다. 

- 하지만 훈련시 이미지를 프로세싱 하기 때문에 훈련시간이 증가하게됩니다.

출처- https://towardsdatascience.com/image-augmentation-for-deep-learning-histogram-equalization-a71387f609b2

model.compile()

- 모델 학습 이전 학습 방식에 대해 환경설정을 하는 부분입니다 

- 모델을 학습 할 때 사용할 최적화 방식과 loss 계산 방식을 지정합니다. 

   - optimizer: 모델 학습시 loss값을 이용하여 weights값을 업데이트 할 때 어떤식으로 업데이트 할 것인지를 결정

      - 자주 사용되는 optimizer: adam, rmsprop, sgd, adagrad

   - loss: 모델의 예측 값이 얼마나 잘 못하는가를 계산하는 식 

      - 자주 사용되는 loss: mse, categorical_crossentropy(다항분휴), binary_crossentropy(이진분류)

   - metrics: 모델 훈련 평가 기준 , 학습에 영향을 미치지 않고 학습이 얼마나 잘 되고 있는지를 모니터링 할 수 있게 함

model.fit()

- 모델 학습을 하는 부분 

- 사용할 데이터, 훈련 반복 횟수, batch size등을 지정

model.save()

- 학습한 모델 weights 파일을 저장

Inception v3 model trainfer learning

transfer learning 이란 전이학습으로 이미 누군가 학습해 놓은 weights를 받아 custom data로 추가 학습하는 것을 이야기 합니다.

- 인공신경망의 경우 신경망 앞단에서는 일반적인 특징(직선, 원,..)을 뒷단에서는 자세한 특징(바퀴, 나선형 패턴, 손가락,,,)을 학습합니다 

- 주로 VGG, Inception, ResNet이 사용되고 상황에 따라 다른 모델을 사용해도 무방합니다

- 이미 대용량 데이터로 학습된 모델의 밑단을 다시 모델링하고 이를 재학습하는 과정을 거칩니다

- 내가 가진 데이터가 많은 경우 중간~끝단 레이어를 재학습합니다. (Strategy 2)

- 내가 가진 데이터가 적거나 가진 데이터가 사전 학습된 모델에 사용된 데이터와 아주 유사할 경우 classifier단만 재학습하거나 끝쪽 레이어도 함께 재학습합니다. (Strategy 3)

모델링 전체 소스코드

## Import the inception model
from tensorflow.keras.applications.inception_v3 import InceptionV3

# Create an instance of the inception model from the local pre-trained weights
local_weights_file = 'data/C2_W3/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'
pre_trained_model = InceptionV3(input_shape=(150, 150, 3), include_top=False, weights=None)
pre_trained_model.load_weights(local_weights_file)

# Make all the layers in the pre-trained model non-trainable
for layer in pre_trained_model.layers:
    layer.trainable = False

# Print the model summary
pre_trained_model.summary()
last_layer = pre_trained_model.get_layer('mixed7')
print('last layer output shape: ', last_layer.output_shape)
last_output = last_layer.output 

## ADD MY MODEL
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation = 'relu')(x)
x = layers.Dropout(0.2)(x)
x = layers.Dense(1, activation = 'sigmoid')(x) 
model = Model(pre_trained_model.input , x)
model.compile(optimizer = RMSprop(lr=0.0001), loss = 'binary_crossentropy', metrics = ['accuracy'])

하나하나 떼어내어 보겠습니다.

## Import the inception model
from tensorflow.keras.applications.inception_v3 import InceptionV3

# Create an instance of the inception model from the local pre-trained weights
local_weights_file = 'data/C2_W3/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'
pre_trained_model = InceptionV3(input_shape=(150, 150, 3), include_top=False, weights=None)
pre_trained_model.load_weights(local_weights_file)

tensorflow에서는 Inceptionv3모델을 제공합니다.

Inception model의 경우 최상단 층이 Fc layer로 구성되어 이를 사용하는것을 원하지 않는 경우 include_top = False로 설정합니다.

대용량 데이터로 미리 학습된 모델의 weights를 다운받아 load합니다 

# Make all the layers in the pre-trained model non-trainable
for layer in pre_trained_model.layers:
    layer.trainable = False

모델의 layer를 돌며 trainable = False로 설정합니다 -> 기존 모델의 layer를 학습하지 않겠다는 의미입니다(freeze)

# Print the model summary
pre_trained_model.summary()
last_layer = pre_trained_model.get_layer('mixed7')
print('last layer output shape: ', last_layer.output_shape)
last_output = last_layer.output

pre_model.summary() 실행시 inception model의 구성이 프린트 됩니다 

괄호 앞(빨간 박스)부분이 레이어 이름이며 .get_layer('layer_name')을 적어 해당 레이어를 마지막 단으로 사용할 것이라 설정합니다. (last_layer)

## ADD MY MODEL
x = layers.Flatten()(last_output)
x = layers.Dense(1024, activation = 'relu')(x)
x = layers.Dropout(0.2)(x)
x = layers.Dense(1, activation = 'sigmoid')(x) 
model = Model(pre_trained_model.input , x)
model.compile(optimizer = RMSprop(lr=0.0001), loss = 'binary_crossentropy', metrics = ['accuracy'])

last_layer의 output을 input으로 하는 레이어를 추가합니다.

전이학습 레이어의 마지막단을 사용하더라고 classifier단은 꼭 나의 데이터에 맞게 재구성 해야합니다. 

이후 컴파일- fit 과정을 거쳐 모델을 학습합니다.

 

관련 공식문서입니다. 참고하셔도 좋을 것 같습니다

https://www.tensorflow.org/tutorials/images/transfer_learning?hl=ko 

 

사전 학습된 ConvNet을 이용한 전이 학습  |  TensorFlow Core

도움말 Kaggle에 TensorFlow과 그레이트 배리어 리프 (Great Barrier Reef)를 보호하기 도전에 참여 사전 학습된 ConvNet을 이용한 전이 학습 이 튜토리얼에서는 사전 훈련된 네트워크에서 전이 학습을 사용

www.tensorflow.org

간단한 궁금증!

Q. 내 데이터는 의료 데이터(특수 분야 데이터)인데 다른 일반적인 이미지로 학습된 모델을 사용해도 될까요?

A. 가능합니다. -> http://www.yoonsupchoi.com/2017/08/08/ai-medicine-4/ 참고(의료 데이터에 적용한 예시)

 

Comments