카드

참고한 사이트 " https://www.popit.kr/tf-slim-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0/ "

내 수준에서 딥러닝을 공부하기에 딱 좋게 정리해주셨다...

 

지금 내가 진행중인 딥러닝관련하여 slim모델을 사용중인데 이것이 뭔지 모르고 그냥 좋다길래 썼다... 뭔지 모르고 그냥 쓰니 코드에서 이해가 안 가는 부분도 생기고 밑바닥이 뚫려있으니 밑빠진 독에 물 붓는 느낌이라 공부가 필요했다.

 

TF-slim

TF-slim은 저수준의 텐서플로우 API를 간편하게 사용할 수 있는 고수준 경량 API라고 한다.

이게 뭔뜻이냐..? 저수준 API를 사용해서 모델을 학습하고 평가하는 과정을 간소화 한다는 것.

즉 내가 수어를 번역기를 만들기 위하여 각 동작에 맞는 이미지에 폴더를 분류했을 때, 이 경우 검증된 다양한 이미지모델 (Inception< 지금 내가 사용하는 inception_v1, VGG, ResNet<멘토님이 알려주신 inception보다 가벼운 모델)에 대해 이미지넷 데이터셋을 기반으로 pre-trained된 모델을 기반으로 fine-tuning하는 과정이 단순화 되어있다. 밑바닥 학습이라고 하던가.

TF-Silm라이브러리를 사용하면 텐서플로우를 사용하여 변수를 정의하고 어퍼레이션을 구성할 때 반복적으로 복사, 붙여넣기 하는 코드간의 중복을 제거할 수 있다고 한다. 이것을 통해 네트워크 모델을 더 적은 코드로 정의할 수 있고 가독성이 높아진다.

 

Scope

텐서플로우에서 변수의 이름을 한정하기 위해 tf.name_scope와 tf.variable_scope를 제공한다. 또한 TF-slim에서는 중복되는 코드를 제거하기 위한 silm.arg_scope를 제공한다. slim.arg_scope를 사용하면 오퍼레이션마다 중복되는 인자값들을 공통화 할 수 있어서 코드가 간소화된다.

 

변수

변수를 생성하고 조작하는 방법도 단순화하였는데, 모델변수라는 개념을 추가한다. slim.model_variable

텐서플로우에서 변수는 훈련을 통해 업데이트하는 모델의 파라미터를 구성하는 변수와 훈련과정에는 필요하지만 모델을 구성하지 않는 일반 변수(global_step, loss 등)로 구분할 수 있지만 프로그램 구문적으로는 구분되어있지 않다. 이걸 TF-slim에서는 slim.model_variable구문을 추가하여 모델 변수와 일반 변수를 프로그램 구문적으로 구분할 수 있다.

 

레이어

가중치와 바이어스 등의 변수(모델의 파라미터를 구성하는 변수인데)와 tf.nn.conv2d등 오퍼레이션 관점이 아닌 추상화 된 레이어 관점에서 모델을 구성할 수 있도록 레이어 함수가 추가되었다. 

다음과 같다.

레이어 TF-Slim
 BiasAdd  slim.bias_add
 BatchNorm  slim.batch_norm
 Conv2d  slim.conv2d
 Conv2dInPlane  slim.conv2d_in_plane
 Conv2dTranspose (Deconv)  slim.conv2d_transpose
 FullyConnected  slim.fully_connected
 AvgPool2D  slim.avg_pool2d
 Dropout  slim.dropout
 Flatten  slim.flatten
 MaxPool2D  slim.max_pool2d
 OneHotEncoding  slim.one_hot_encoding
 SeparableConv2  slim.separable_conv2d
 UnitNorm  slim.unit_norm

 

 

데이터

텐서플로우를 사용할 때 가장 까다로운 부분이 훈련과 평가에 사용할 데이터셋 이터레이터를 구성하는 일이라고 한다. TF-slim에서는 TFRecord포맷을 기반으로 데이터셋을 생성하고, 훈련과 평가를 할 때 데이터를 피드해주는 데이터프로바이더를 추가하는 등의 과정이 텐서플로우보다 간단히 구성할 수 있다고 한다

 

손실함수

딥러닝 중 콘솔창에 global_step과 loss가 나오는데, 좀 궁금했다. 이것은 slim모델에서 제공하는 slim.losses모듈인데, 텐서플로우에서 제공하는 손실함수도 간단해서 크게 차이는 없다고 하지만 멀티태스크 작업에서 여러개의 손실함수를 사용해야하는 경우, 여러개의 손실 함수를 하나로 합칠 수 있다고 한다. 옵티마이저는 텐서플로우 옵티마이저를 그대로 사용한다.

옵티마이저에 대해서도 공부해야 한다... ResNet모델 사용시 옵티마이저에 관한 오류가 뜨기때문...

 

훈련

반복적으로 훈련을 하기 위하여  slim.learning모듈을 제공한다. 

 

평가

학습된 모델에 대한 평가를 위한 slim.evaluation 모듈을 제공.

 

메트릭

정확도, 재현율 등 자주 사용하는 메트릭을 쉽게 사용할 수 있는 slim.metrics 모듈 제공

 

네트워크

자주 사용하는 이미지 모델(내 경우엔 Inception, resnet)을 쉽게 활용할 수 있도록 slim.net모듈을 제공한다.

예를들어 기본 네트워크 모델로 Inception 모델을 사용하는 경우, 아래처럼 모델을 임포트 할 수 있다. 

https://www.popit.kr/tf-slim-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0/

이경우는 그냥 nets에 있는 모델을 모두 임포트 하는듯하다 

지금 내가 사용하고 있는 코드에서의 slim.nets모듈 임포트
nets_factory에 들어가면 무엇을 임포트 해야하는지 알 수 있다.

 

모델 정의하기 

TF-Slim에서 네트워크 모델 정의

위 사진에서 알 수 있듯 네트워크 모델을 정의하려면 변수와 오퍼레이션 그리고 스코프가 필요한데, TF-slim에서는 변수를 생성하는 방법이 위와같이 간소화 되어있다. slim.arg_scope를 사용해서 오퍼레이션마다 중복되는 인자들을 공통화할 수 있다. 그리고 모델을 구성하는 레이어의 경우 변수가 아닌 추상화된 TF-Slim레이어 함수를 사용하면 좀 더 쉽게 정의할 수 있다. 

 

 

BELATED ARTICLES

more