-
efficientNet딥러닝/tensorflow 2020. 2. 8. 22:25
일단 이전에 pytorch 게시판에서 작성한 hardnet 등의 segmentation 이후의 classification 에 대한 모델 중
SOTA 알고리즘으로 efficientNet 을 사용하였다
efficientNet에 관련한 설명은 아래 링크에 잘 설명되어 있다
https://norman3.github.io/papers/docs/efficient_net
EfficientNet: Rethinking Model Scaling for CNN.
참고로 그림 2(a) 에서 입력 크기는 \(<224, 224, 3>\) 이고, 출력 크기는 \(<7, 7, 512>\) 이다.
norman3.github.io
그리고 내부에 쓰인 MBConv layer는 아래 링크의 linear bottleneck을 참조
[논문정리] MobileNet v2 : Inverted residuals and linear bottlenecks
MobileNet v2 : Inverted residuals and linear bottlenecks MobileNet V2 이전 MobileNet → 일반적인 Conv(Standard Convolution)이 무거우니 이것을 Factorization → Depthwise Separable Convolution(이하 DS..
n1094.tistory.com
간단하게만 설명하자면 convolution layer의 filter 크기를 줄였다 키우는 것만으로도 연산량이 줄어든다는 것이다
이를 사용한 MBConv를 사용하여 efficientNet를 만들었는데
efficientNet은 B0부터 현재 B8까지 점점 모델이 커지는 형태로 나와있다
모델을 키우는 공식은 첫번째 링크의 높이, 깊이, 이미지 크기에 비례한 공식이 첫번째 링크에 있으니 참조
아무튼 이전에 mmdetection을 사용해서 나온 segmentation mask 이미지를
해당 모델에 넣어서 image classification를 수행하는 efficientNet을 생성
일단 pretrained model을 넣고 그 위에 추가적으로 학습을 진행했다
환경은 tensorflow 2.0의 keras를 사용
(이건 또 keras...)
코드는 프로젝트를 진행하면서 너무 급하게 짜느라 너무 개판으로 짜서 약간 다듬어서 올림
EfficientNet 코드
from keras.preprocessing.image import ImageDataGenerator from keras.layers import GlobalAveragePooling2D, Dropout, Dense from keras.callbacks import EarlyStopping, ModelCheckpoint, CSVLogger, TensorBoard from keras.models import Sequential from keras.optimizers import Adam from math import ceil from time import time import keras.backend.tensorflow_backend as K import tensorflow as tf import efficientnet.keras as efn import numpy as np import argparse import random import keras import sys import cv2 import csv import os # config = tf.ConfigProto() # config.gpu_options.allow_growth = True # K.set_session(tf.Session(config=config)) class EFNet(): def __init__(self, output_size, batch_size, ef_nm, img_shape, sample_size): self.output_size = output_size self.batch_size = batch_size self.ef_nm = ef_nm self.weight_path = "weight/"+self.ef_nm+".h5" self.log_path = "log/" + self.ef_nm + ".csv" self.img_shape = img_shape self.sample_size = sample_size # self.graph = tf.get_default_graph() effnet = self.getEFNet() self.model = self.buildModel(effnet) def getEFNet(self): effnet = efn.EfficientNetB4(weights=None,\ include_top=False,\ input_shape=self.img_shape) # effnet.load_weights('weight/efficientnet-b4_imagenet_1000_notop.h5') for i, layer in enumerate(effnet.layers): if "batch_normalization" in layer.name: effnet.layers[i] = GroupNormalization(groups=self.batch_size, axis=-1, epsilon=0.00001) return effnet def buildModel(self, effnet): model = Sequential() model.add(effnet) model.add(GlobalAveragePooling2D()) model.add(Dense(self.output_size, activation='sigmoid')) model.compile(loss="sparse_categorical_crossentropy",\ optimizer=Adam(lr=0.00005),\ metrics=['acc']) return model if __name__ == "__main__": efnet = EFNet(255, 8, 'name', (256,256,3),1)
위 코드는 efficientNet을 생성하는 코드이다
batch normalization 대신 group normalization으로 바꿔주었다
groups args 값은 batch size 만큼 넣어야 하는데 실제 프로젝트에서는 너무 정신없다보니 해당 값으로 변경해줄 경황이 없었다
batch normalization 에 대한 설명은 아래 링크
https://jsideas.net/batch_normalization/
Batch Normalization
a novice's journey into data science
jsideas.net
group normalization에 대한 설명은 아래 링크
https://blog.lunit.io/2018/04/12/group-normalization/
Group Normalization
이번 포스트에서는 최근 많이 회자되고있는 Yuxin Wu와 Kaiming He가 2018년 3월에 공개한 논문 Group Normalization에 대해 살펴보도록 하겠습니다. 이 논문에서는 batch의 크기가 극도로 작은 상황에서 batch normalization 대신 사용하면 좋은 normalization 기술을 소개했는데, Faster RCNN…
blog.lunit.io
global average pooling에 대한 설명은 아래 링크
https://kevinthegrey.tistory.com/142
3. Convolutional Networks / L2. Convolutional Neural Networks - Pooling Layers
Pooling Layers - CNN을 구성하는데 필요한 중간, 최종 레이어에 대해 알아보자. - Pooling layer 라 부르는 이 레이어는 주로 콘볼루션 레이어를 input으로 받아들인다. - 콘볼루션 레이어는 각 필터당 하나의 f..
kevinthegrey.tistory.com
learning rate는 5e-5로 매우 작은 값을 설정해줬다
해당 이유는 pretrained model 이기 때문
pretrained model의 경우 아래 링크에 있다
https://www.kaggle.com/ratthachat/efficientnet-keras-weights-b0b5
EfficientNet Keras Weights B0-B5
www.kaggle.com
내일은 generator를 사용한 학습 코드를 올려야겠다
'딥러닝 > tensorflow' 카테고리의 다른 글
[tensorflow 2] loss, optimizer 유동적으로 가져오기 (0) 2020.04.22 [tensorflow 2] DataLoader 사용법 (0) 2020.04.22 [keras] generator를 이용한 multiple input data (0) 2020.02.17 efficientNet 개발 (3) (0) 2020.02.12 efficientnet 개발 (2) (0) 2020.02.12