갬미의 성장일기
텐서플로우 개발자 자격증 준비하기 [3] - CV (Course 2) 본문
두번째 코스에서는 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 한 모델을 만들기 위해 사용
- 이를 적용할 경우 오버피팅 가능성이 줄고 이미지를 증식하여 저장하는것이 아닌 학습에 사용 하는것으로 메모리 사용량을 줄일 수 있습니다.
- 하지만 훈련시 이미지를 프로세싱 하기 때문에 훈련시간이 증가하게됩니다.
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
간단한 궁금증!
Q. 내 데이터는 의료 데이터(특수 분야 데이터)인데 다른 일반적인 이미지로 학습된 모델을 사용해도 될까요?
A. 가능합니다. -> http://www.yoonsupchoi.com/2017/08/08/ai-medicine-4/ 참고(의료 데이터에 적용한 예시)
'Deep Learning > Tensorflow cert' 카테고리의 다른 글
텐서플로우 개발자 자격증 준비하기 [2] - Intro (Course 1) (0) | 2021.11.28 |
---|---|
텐서플로우 개발자 자격증 준비하기 [1] - 응시 환경 설정 및 후기 (0) | 2021.11.28 |