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]