아래 논문에서 깔끔하게 정리를 해놓았네요!

 

Wang, M., & Deng, W. (2018). Deep Face Recognition: A Survey. arXiv preprint arXiv:1804.06655.

 

얼굴쪽은 data-preprocessing과 dataset이 엄청난 영향을 끼치는 것 같습니다.

그래서 최근에 중국이 얼굴인식 분야는 전부 삼켜버렸죠..

모델이 epoch를 도는 순간에는 model.save를 사용할 순 없습니다.

이럴때 사용할 수 있게 callback이라는 기능을 제공을 해주었습니다. 

정한 epoch 또는 1 epoch이 끝날때마다 이 함수를 불러서 정해놓은 기능을 호출하는데요.

이 글에서는 모델 저장하는 법을 알려드리겠습니다.


1. from keras.callbacks import ModelCheckpoint


2.

다른 param은 Keras.io를 참고하세요. weight만 저장하는 기능도 있어 보입니다.

https://keras.io/callbacks/#modelcheckpoint


3.

이런식으로 callbacks에 세팅을 해주시면 자동으로 정해놓은 path에 저장을 해줍니다.


4.


* Flow를 사용하지 않고, fit_generator에서는 generator만 호출하면 됩니다. Flow를 쓰고싶은 경우에 이렇게 쓰면 된다는 것을 보여주는 글입니다.

 

우리가 만든 모델이 오버피팅되어 있다면, 해결방법 중 하나는 훈련셋의 데이터 양을 늘리는 것입니다. 

케라스에서는 이에 대하여 ImageDataGenerator로 간편한 data augmentation 기능을 제공해주고 있죠.

만약 우리가 디렉토리에 클래스별로 예쁘게 구분을 잘 지어놨다면 flow_from_directory 를 사용하면 되겠지만, 현실은 그렇지 않은 경우가 많은데요

이럴때는 그냥 flow 를 사용하시면 됩니다.

위의 사진처럼 간단하게 사용하시면 됩니다.

중간에 있는 datagen.fit은 featurewise기능이나 ZCA_whitening을 사용할 때 해주어야 되는 기능인데요. 이 두개의 기능을 사용하지 않는다면 굳이 쓸 필요는 없습니다.

ZCA 화이트닝은 다음과 같습니다.

 

이렇게 ImageDataGenerator 객체를 만들어둔 뒤, model.fit_generator내부에서 사용을 해주시면 됩니다.

 

Reference

 https://keras.io

 

'# Machine Learning > Keras Implementation' 카테고리의 다른 글

keras Custom generator - 1  (1) 2019.07.29
TTA(test time augmentation) with 케라스  (2) 2019.07.01
Keras callback함수 쓰기  (0) 2018.12.23
CNN visualization code (3)  (0) 2018.11.26
CNN visualization code (2)  (0) 2018.11.26

여기에서 쓰이는 방법들은 Keras API를 기준으로 작성합니다.


일단 deconvolution = conv2Dtranspose와 upsampling의 공통점은 pooling등의 연산으로 인해 줄어든

이미지를 다시 원이미지로 키울 때 사용됩니다.


upsampling은 keras에 내장된 라이브러리를 따라가서 코드를 보시면

image_resize를 불러서 단지 size만 맞춰주게 됩니다.


( def call에서 K.resize_images를 부르는 것을 볼 수 있다.)


반면에 deconvolution은 weight를 가진 filter를 사용해서 resize하고,

이 weight를 업데이트(?)하는 것 같습니다. 잘모르겠네요. 

이에 대한 설명은 아래 사진으로 대체합니다. 가장 직관적인 설명인 것 같습니다.

(출처 : https://datascience.stackexchange.com/questions/6107/what-are-deconvolutional-layers)

GoogLeNet 즉, 구글에서 발표한 Inception 계통의 Network에서는 1x1 Convolution을 통해 유의미하게 연산량을 줄였습니다. 그리고 이후 Xception, Squeeze, Mobile 등 다양한 모델에서도 연산량 감소를 위해 이 방법을 적극적으로 채택하고 있습니다. 뿐만 아니라 Semantic Segmentation 연구에서도 채널(Channel) 또는 공간적(Spatial) 특성 파악을 위해 1x1 Convolution 방법 사용이 유의미하다는 것을 증명한 바 있습니다.

깊이 들어가지 않더라도 Image Classification Task에서 모델 구조를 개발한 몇 가지 논문만 살펴보아도 이러한 장점을 단번에 알아볼 수 있습니다.

이번 글에서는 1x1 Convolution을 쉽게 설명해보았습니다. 1x1 Convolution은 직관적으로 1x1 크기를 가지는 Convolution Filter를 사용한 Convolution Layer입니다.

1x1 Convolution에는 크게 세 가지 장점이 있다고 말할 수 있습니다.

  1. Channel 수 조절
  2. 연산량 감소(Efficient)
  3. 비선형성(Non-linearity)

1. Channel 수 조절

Convolution Layer를 사용해서 Custom Model을 구성할 경우, Channel 수는 하이퍼파라미터이기 때문에 우리가 직접 결정해주어야 합니다. 대부분은 논문을 참조하지만, 그렇지 않은 경우는 특성에 맞게 우리가 직접 결정해주어야 합니다.

이 부분에서 1x1 Conv의 장점을 알 수 있습니다. Channel 수는 우리가 원하는만큼 결정할 수 있습니다. 하지만 컨볼루션 연산에서 특히 충분히 큰 크기의 Channel 수를 사용하고자 할때 문제가 되곤 합니다. 왜냐하면 그만큼 파라미터 수가 급격히 증가하기 때문이죠. 하지만 1x1 Convolution을 사용하면 효율적으로 모델을 구성함과 동시에 만족할만한 성능을 얻을 수 있습니다.

파라미터 수가 급격하게 증가하는 것을 예방하기 때문에 Channel 수를 특정 경우가 아닌 이상 마음껏 조절할 수 있고, 다양한 크기를 가진 Convolution Layer를 통해 우리가 원하는 구조의 모델을 구성해볼 수 있습니다.

밑의 그림에서는 이와 같이 1x1x128 Convolution을 활용하여 우리가 원하는 수의 Channel 수를 가지는 층을 구성하고 있습니다.

2. 계산량 감소

* 여기서 파라미터 수는 주로 결과값 크기를 의미합니다. 밑 그림에서 (28*28)을 제거해야 진정한 의미의 파라미터 수라고 말할 수 있습니다. 하지만 편의를 위해 파라미터 수라고 언급하겠습니다. 유의하시길 바랍니다.

* 아래 입력의 크기는 Conv(padding = 'same') 전제하에 계산해주세요.

1x1 Convolution 예시

위 그림처럼 Channel 수 조절은 계산량 감소에 직접적으로 영향을 주게 되어 네트워크를 구성할 때 좀 더 깊게 구성할 수 있도록 도움을 줍니다. 여기서 Channel 수를 줄였다가 다시 늘이는 부분을 Bottleneck 구조라고 표현하기도 합니다. 파라미터 수가 많으면 아무리 보유하고 있는 GPU나 RAM이 좋아도 감당하기 힘드니 우리 입장에선 적극 고려해볼만한 방법입니다.

위 그림을 보면, 위와 아래 예시의 차이는 1x1 컨볼루션 사용 유무입니다.

  1. 빨간색 글씨는 해당 과정에서 사용되는 전체 파라미터 개수를 의미합니다. 윗 부분은 160백만개의 파라미터 수가 필요하고, 아랫 부분은 약 44백만개의 수가 필요하네요. 대략 4배의 차이입니다. 이처럼 1x1 컨볼루션을 사용하면, 사용 유무에 따라 모델 파라미터 수가 급격하게 차이가 납니다.
  2. 초록색 글씨는 컨볼루션 필터가 가지는 파라미터 수입니다.
  3. 파란색 글씨는 필터 크기(또는 갯수)를 나타내며, 초록색 글씨와 곱해 최종 파라미터 수를 구하게 됩니다.
    (28*28은 파라미터가 아니므로 무시해도 무관하나, 여기서는 계산 편의와 직관을 위해 포함합니다.)

따라서, 위 예시의 (28 * 28 * 64 * 5 * 5 * 128)을 해석하면, (5 * 5 * 128) 크기의 컨볼루션 필터가 64개 사용되어 최종적으로 (28, 28, 64) 크기를 가지는 결과물이 나온다는 것입니다.

예시를 통해 각 숫자가 나타내는 의미가 무엇인지 생각해보시기 바랍니다. 만약 정확히 떠오르지 않는다면, 아직 컨볼루션 연산 개념이 정확히 확립되지 않은 것일 수 있습니다.

Convolution Layer는 굉장히 자주 사용하기 때문에 개념을 정확히 알고 넘어가는 것이 큰 도움이 될 수 있습니다.

3. 비선형성

GoogLeNet을 포함하여 구글팀의 수많은 고민이 포함되어 적용된 Inception 계통의 다양한 model version을 공부하면, 많은 수의 1x1 Conv를 사용했다는 것을 알 수 있습니다. 이때 ReLU Activation을 지속적으로 사용하여 모델 비선형성을 증가시켜 줍니다. ReLU 사용 목적 중 하나는 모델의 비선형성을 더해주기 위함도 있습니다. 비선형성이 증가한다는 것은 그만큼 복잡한 패턴을 좀 더 잘 인식할 수 있게 된다는 의미와 비슷하겠죠?

1x1 Convolution을 사용하면서 사용되는 파라미터 수가 감소하게 되고, 이러한 이점을 통해 모델을 더욱 깊게 구성할 수 있습니다. 모델을 깊게 구성하는 과정에서 기존보다 많은 수의 비선형성 활성화 함수를 사용하게 되고, 모델은 점점 더 구체적인 패턴을 파악할 수 있어 성능 향상을 이룰 수 있겠죠?