데이터분석/Tensorflow

[Tensorflow] CNN (Convolutional Neural Networks): cifar-10

쌍쌍바나나 2017. 2. 7. 21:47
반응형

Overview


CIFAR-10 classification은  machine learning에서 공통적으로 benchmark problem이다. 여기서 문제는 RGB 32 x 32 pixel의 이미지들을 10개의 카테고리로 분류하는것이다. 


Goals


image recognition을 위한 작은 convolutional neural network를 build하는 tutorial입니다. 

- network architecture, training, evaluation을 위해서 어떻게 조직화 할 것인지.

- models을 construct하기 위한 template을 제공


CIFAR-10은 model을 만들기위해 tensorflow의 예제코드로 이루어져 있다. 현재는 작고, 빠르게 트레이닝이 가능하다. 

CIFAR-10을 기반으로 새로운 기술과, 아이디어로 모델을 구성할 수 있다. 


Highlights of the Tutorial


tensorflow에서 model을 디자인하고, 생성하기 위한 여러가지 중요한 여러 방법을 CIFAR-10에 포함하고 있다.


* Core mathematical components including convolution (wiki), rectified linear activations (wiki),max pooling (wiki) and local response normalization (Chapter 3.3 in AlexNet paper).

* Visualization of network activities during training, including input images, losses and distributions of activations and gradients.

* Routines for calculating the moving average of learned parameters and using these averages during evaluation to boost predictive performance.

* Implementation of a learning rate schedule that systematically decrements over time.

* Prefetching queues for input data to isolate the model from disk latency and expensive image pre-processing.


뿐만아니라 multi-GPU version에 대해서도 설명하고 있다. 


* Configuring a model to train across multiple GPU cards in parallel.

* Sharing and updating variables among multiple GPUs.


위 tutorials을 통해서 larger CNNs을 building하는게 목적이다. 


Model Architecture


CIFAR-10 tutorial에 있는 model은 convolutions과 nonlinearities로 구성된 multi-layer architecture이다. 

여기 layers들은 fully connected layers로 softmax classifier에 의해서 결과가 나온다. 

model은 Alex Krizhevsky의 architecture에서 몇개의 layers가 차이가 있다. 


이 model은 GPU에서 몇시간이내로 학습한 정확도의 결과가 대략 86%정도 나온다. 

l1,068,298개의 learnable parameters와19.5의 multiply-add operations로 구성되어 있다.


Code Organization


소스코드는 tensorflow git에서 쉽게 clone을 할 수 있다. 

https://github.com/tensorflow/models


소스코드의 구성은 아래와 같다.


cifar10_input.py Reads the native CIFAR-10 binary file format.

cifar10.py Builds the CIFAR-10 model.

cifar10_train.py Trains a CIFAR-10 model on a CPU or GPU.

cifar10_multi_gpu_train.py Trains a CIFAR-10 model on multiple GPUs.

cifar10_eval.py Evaluates the predictive performance of a CIFAR-10 model.


CIFAR-10 Model


cifar10.py에 주로 CIFAR-10 network가 포함되어 있다. training이 완료된 graph는 대략 765개의 operations이 포함되어 있다.

graph를 생성하기 위해서 재사용이 가능한 코드들이 포함되어 있으니, 가져다가 사용하면 된다. (아주 친절)


1. Model inputs: inputs() and distorted_inputs() add operations that read and preprocess CIFAR images for evaluation and training, respectively.

2. Model prediction: inference() adds operations that perform inference, i.e. classification, on supplied images.

3. Model training: loss() and train() add operations that compute the loss, gradients, variable updates and visualization summaries.


- model inputs

    - inputs(), distorted_inputs()은 CIFAR-10 binary data files로 부터 images를 읽는데 사용을 한다. 이 파일들은 고정된 바이트 레코드의 길이를 포함하고 있기 때문, tf.FixedLengthRecordReader를 사용한다.

    - 이미지 전처리는 아래와 같이 진행한다.

        - They are cropped to 24 x 24 pixels, centrally for evaluation or randomly for training.

        - They are approximately whitened to make the model insensitive to dynamic range.

    - 트레이닝을 하기 위해, 추가적으로 artificially 데이터 set의 사이즈를 증가시키기 위해, random distortions의 series를 적용을 한다.

        - Randomly flip the image from left to right.

        - Randomly distort the image brightness.

        - Randomly distort the image contrast.

    - image_summary를 이용해서 tensorboard에서 image를 확인이 가능하다. 

    - disk로 부터 images를 읽고, distorting하는 시간이 processing time에서 많은 양을 차지 할 수 있다. training하는 operation의 시간을 예방하기 위해서 TensorFlow queue에 16개의 operate threads를 끊임없이 사용했다.


- model prediction

    - inference()의 함수에서는 logits을 계산하기 위해서 operations을 추가한다. 모델은 아래와 같이 구성

        - layer description

        - conv1 convolution and rectified linear activation.

        - pool1 max pooling.

        - norm1 local response normalization.

        - conv2 convolution and rectified linear activation.

        - norm2 local response normalization.

        - pool2 max pooling.

        - local3 fully connected layer with rectified linear activation.

        - local4 fully connected layer with rectified linear activation.

        - softmax_linear linear transformation to produce logits.


    - inference의 ouput은 un-normalized logits이다. tf.nn.softmax()를 사용해서 normalized predictions을 반환하는 로직을 구현해보자.

    - input(), inference() 함수는 모델을 evaluation하는데 필수적으로 사용되는 components이다. 

    - inference()에서의 models architecutre는 CIFAR-10 model과는 다소 차이가 있다. 특히 기존 Alex’s의 original model의 top layers는 fully connected가 아닌, locally connected이다. 이런점을 고려해 구성을 해보는것도 좋다.


- model training

    - N-way classificatiion을 수행하기 위한 network를 training하기 위해 보편적으로 사용되는 방법은 multinomial logistic regression이다. (aka. softmax regression.). softmax regression은 softmax nonlinearity를 label의 1-hot encoding과 normalized predictions사이에서의 cross-entropy를 계산하고, network의 output에 적용하는 방법을 말한다. regularization을 위해 보통 weight decay losses를 적용한다. loss() 함수로 부터 반환된 값인 weight decay terms, cross entropy loss의 합은 모델을 위한 objective function이다.

    - gradient descent algorithm과 exponentially decays의 learning rate를 사용해서 model을 학습한다.

    - train() 함수는 gradient의 값이 최소가 되고, learned variables를 업데이트하기 위해 operations의 추가가 필요하다. 이 함수는 images의 한번의 batch를 위한 모델을 update하고, train을 하기 위해 필요한 모든계산을 하는 operation을 반환한다


Launching and Training the Model


위에서 모델을 build를 완료하였다. 모델을 launch하고, script를 통해  training operation을 수행해보자. 


$ python cifar10_train.py


최초에 dataset이 없으면, 자동으로 데이터를 다운로드 받는다. 데이터 셋의 크기는 대략 ~160MB이다. 


만약 여기서 

TypeError: strided_slice() takes at least 4 arguments (3 given)

와 같은 에러가나면, tensorflow 버전을 확인해보는게 좋다. 

import tensorflow as tf

tf.__version__


인줄 알았는데… 아니 였음. 따로 issue가 있었는데,

https://github.com/tensorflow/models/issues/817

tensorflow 버전이 아닌, cifar의 버전을 맞춰야 한다. 

https://github.com/tensorflow/models/pull/769


해결방법은 아래와 같다.

http://stackoverflow.com/questions/41195121/tensorflow-strided-slice-missing-argument-strides


tf.contrib.deprecated.image_summary('images', images)

와 같은 에러가 났으나,

tf.summary.scalar()로 대신 변경하면 동작

https://www.tensorflow.org/api_docs/python/summary/generation_of_summaries_

0.12r의 API문서를 확인하는게 좋다.



다운로드를 받고 training을 하면 아래와 같은 output을 볼 수 있을것이다.

script는 10 steps마다 화면에 결과를 출력한다.


2016-12-29 14:59:25.595257: step 1590, loss = 1.96 (195.0 examples/sec; 0.656 sec/batch)

2016-12-29 14:59:32.323162: step 1600, loss = 1.88 (171.6 examples/sec; 0.746 sec/batch)

2016-12-29 14:59:38.942774: step 1610, loss = 1.75 (195.5 examples/sec; 0.655 sec/batch)

2016-12-29 14:59:45.613060: step 1620, loss = 1.80 (194.6 examples/sec; 0.658 sec/batch)

2016-12-29 14:59:52.385803: step 1630, loss = 1.92 (196.1 examples/sec; 0.653 sec/batch)

2016-12-29 14:59:59.000392: step 1640, loss = 1.87 (195.8 examples/sec; 0.654 sec/batch)

2016-12-29 15:00:05.640369: step 1650, loss = 1.74 (193.1 examples/sec; 0.663 sec/batch)


cifar10_train.py는 주기적으로 모든 모델의 parameters을 checkpoint files에 저장한다.

이렇게 저장된 checkpoint files은 cifar10_eval.py에서 predictive performance를 측정하기 위해 사용된다. 

cifar10_train.py는 어떻게 모델을 학습시키는지에 대해서 최소한의 insight를 제공한다. 


* Is the loss really decreasing or is that just noise?

* Is the model being provided appropriate images?

* Are the gradients, activations and weights reasonable?

* What is the learning rate currently at?


TensorBoard에서 cifar10_train.py 의 SummaryWriter로 부터 주기적으로 추출된 데이터를 화면에 출력을 해준다. 

예를 들어서 activations, sparsity의 degree와 같은 분포를 알 수 있다. 


개별적으로 loss functions과 더불어 total loss, 특정 관심있는항목을 확인이 가능하다. 

그러나, loss는 training이 되는 small batch size  때문에 noise의 considerable amount를 나타낸다. (?) 무슨말이지…. 

training하는 batch size가 작기 때문에, 그 해당 small batch size에서의 loss의 양이 표시된다는 의미 같다.

특히, moving averages를 확인이 가능하기 때문에 매우 유용하다. 왜?… moving average를 보는게 의미가 있겠지? 

moving average에 대해서 자세한 내용은 사이트 참고 ExponentialMovingAverage 


Evaluating a Model


trained model 이 얼마나 잘됬는지 evaluation하는 방법이다. evaluation하기 위해서는 cifar10_eval.py를 사용하면 된다.

inference()와 10,000 images를 사용해서 model을 구성했다. 얼마나 정확하게 image를 예측하는지에 대해서 precision을 계산한다. 


trainining하는 model이 improves를 얼마나 하는지 확인하기 위해서, evaluation scripts는 주기적으로 가장 최근 checkpoint files을 실행한다. 

만약 여게서 evalution과 training binary를 같은 GPU에서 실행을 하지 않는다면 에러가 난다. 그러므로 같은 GPU에서 실행을 해야한다. 


cifar10_eval.py도 TensorBoard에 visualization을 한다. 이러한 요약은 모델을 evaluation하는데 추가적인 insight를 제공할 것이다. 


training script는 모든 learned variables에 대해서 moving average version을 계산한다. evaluation script는 모든 learned model parameters를 moving average version으로 대체한다.

이 대체는 evaluation time에서 model performance를 boosts한다. (무슨말일까? evaluation하는 step에서도 model performance를 향상을 시키나…?)


Training a Model Using Multiple GPU Cards


Tensorflow에서도 여러개의 GPU에서 training operation을 동시에 수행이 가능하다.. 

(여기는 GPU Cards가 여러개 있을때 읽어보자….) 일단 보류





 



반응형