TensorMSA Guide – Residual Neural Network

Use Residual Neural Network

Concept of this algorithm

ILSVRC의 winning 네트워크들의 추세를 봐도 알수 있는 사실이지만 네트워크의 레이어를 층층이 쌓아서 깊게 구현하면 더 좋은 성능을 낸다. 하지만 레이어를 깊게 쌓는 것이 항상 좋은 결과를 낼 까? 네트워크를 깊게 쌓으면 gradient vanishing/exploding 현상이 발생할 수 있기 때문에 네트워크는 학습의 초기 단계부터 saturated되어 버릴 우려가 있다. 하지만 이 문제는 BN, Xavier 초기화(PReLU-net 참조) 등을 이용하면 수십개의 레이어까지는 해결이 된 상태이다. 하지만 네트워크가 더 깊어지면 degradation 이라 불리는 문제가 발생한다. 네트워크는 깊어지는데 정확도는 saturated 되는 현상이다. 사실 이는 overfit을 생각하면 당연하다고 생각 할 수 있지만 놀랍게도 degradation은 overfit에 의한 것이 아닌 애초에 트레이닝 에러 자체가 높아지는 현상이다.
아래 그림은 degradation의 예시를 보여준다.

일반적인(Plain) 네트워크는 위와 같은 레이어 구조를 가진다. 이 때 두 레이어를 거친 후 매핑된 결과는 H(x) 로 표현하며 아래와 같이 표현 H(x)=F(x,{Wi}) 여기서 위 네트워크는 2개의 레이어를 가지고 있기 때문에 F=W2σ(W1x) 이다. x 는 입력 벡터이며 σ 는 ReLU activation을 의미한다. 식을 간단히 쓰기 위해서 바이어스는 생략하였다. residual 네트워크는 일반적인 네트워크와는 달리 몇개의 레이어 (여기에서는 2개의 레이어)를 건너 뛴 shortcut을 활용한 것이 특징이다. H(x) 는 H(x)=F+x 으로 표현할 수 있다.

APIs – Single Train Process

resp = requests.put('http://' + url + '/api/v1/type/wf/state/netconf/detail/renet/nnid/'+nn_id+'/ver/'+wf_ver_id+'/node/netconf_node/',
                 json={
                     "param":{"traincnt": 1
                              ,"epoch": 1
                              ,"batch_size":200
                              ,"predictcnt": 2
                              ,"predictlog": "N" 
                              ,"augmentation": "Y"
                     },
                     "config": {"num_classes":1,
                                "learnrate": 0.001,
                                "layeroutputs":18, #18, 34, 50, 101, 152, 200
                                "optimizer":"adam", #
                                "eval_type":"category"
                                 }
                     ,"labels":[]
                    })

resp = requests.put('http://' + url + '/api/v1/type/wf/state/imgdata/src/local/form/file/prg/source/nnid/'+nn_id+'/ver/'+wf_ver_id+'/node/datasrc/',
                     json={"preprocess": {"x_size": 32,
                           "y_size": 32,
                           "channel":3,
                           "filesize": 1000000,
                           "yolo": "n"}
            })
dataconf = json.loads(resp.json())

훈련하고자 하는 데이터에 대한 속성과 Residual Net의 하이퍼파라메터를 정의하는 작업으로 AutoML 형태가 아니기 때문에 정해진 값을 세팅하는 형태로 진행도고 있다.
특성있는 파라메터로는 아래와 같은 예들이 있다.
1. augmentation : 데이터 불리기 여부 (Rgb, Rotation, Cropping 등 복합적 사용)
2. layeroutputs : ResNet Depth (18, 34, 50, 101, 152, 200 중에 선택)
3. channel : 3인 경우 컬러, 1인 경우 흑백으로 판단
4. x_size, y_size : 이미지 전처리 사이즈 (동일한 사이즈로 변환 해주어야 함)
5. yolo : Object Detction 을 통한 Cropping 적용 여부

resp = requests.post('http://' + url + '/api/v1/type/runmanager/state/train/nnid/'+nn_id+'/ver/'+wf_ver_id+'/')
data = json.loads(resp.json())

정의된 세팅 값에 맞춰서 훈련을 시작합니다. 훈련을 시작하면 정해진 Graph Flow에 맞춰서 작업이 자동으로 실행되고 주어진 데이터를 가공하고, 훈련하고, 평가하는 프로세스가 실행됩니다.

APIs – Predict

files = {'files000001':  open('/home/dev/hoyai/demo/data/airplane/1air.jpg','rb')
    ,'files000002':  open('/home/dev/hoyai/demo/data/airplane/2air.jpg','rb')}
resp = requests.post('http://' + url + '/api/v1/type/service/state/predict/type/renet/nnid/'+nn_id+'/ver/'+wf_ver_id+'/',
                     files=files)

예측하고자 하는 파일을 서버로 업로드하여 예측결과를 리턴 받습니다.

FileName = 2air.jpg
['Bolt', 'Air Filter']
[100.0, 0.0]

FileName = 1air.jpg
['Bolt', 'Air Filter']
[100.0, 0.0]

 

Example – Jupyter

http://IP:8888/notebooks/chap20_hoayi_api_guide/02.image/04_resnet_train_predict.ipynb

Leave a Reply

Your email address will not be published. Required fields are marked *