Caffe 구성 요소들 알아보기: blobs, nets, layer, solver, prototxt ๑•‿•๑
안녕하세요, 기메링입니다. (키메링 아님)
원래 계획은 MNIST예제에 대한 내용을 다음 포스팅으로 하려고 준비중이었는데, 쓰다보니 내용이 너무 길어지고 답답해져서(?) 결국 하나를 따로 작성해 보려고 합니다.
Caffe나 그 요소들에 대한 설명 강의들은 다른 블로그에도 많긴 하지만, 제 나름대로 따로 정리해 보도록 하겠습니다 (・ิω・ิ)
아래와 같은 순서로 진행하겠습니다.
- prototxt
- Elements of Caffe : Blobs, Layers, Nets
- Solver
- Network
prototxt
Caffe 모델은 plaintext protocol schma (prototxt)로 정의되며, 학습된 모델은 binary protocol buffer (binaryproto) , 즉 .caffemodel 파일로 정렬됩니다.
이번에 알아볼 prototxt는 procol buffer 형식의 파일인데요, 이것은 연속적으로 구조화된 데이터를 표현하는 매커니즘이라고 생각하시면 됩니다. Caffe에서 사용할 protobuf들의 정의는 caffe_root/src/caffe/proto/caffe.proto 에서 확인할 수 있습니다.
Caffe가 prototxt를 채택함으로써 Caffe 모델링의 유연성과 확장성에 기여를 하게 되었습니다. 장점은 아래와 같아요.
- 효율적인 직렬화(serialize)
- 직렬화 될 때 작은 크기의 이진 문자열
- 사람이 읽을 수 있는, 이진 버전과 호환되는 텍스트 형식
- 여러 언어의 효율적인 인터페이스 구성 (특히 C+
+, Python)
이 링크 로 이동하시면 prototxt에 대한 자세한 설명을 영어로 읽어보실 수 있습니다.
Elements of Caffe
- Blobs
그림 1에서 보이는 것 처럼, Blob는 Layer 사이 데이터 이동의 기본 단위입니다.데이터를 보유하는 통합 메모리 인터페이스 (이미지 배치, 모델 파라미터, 최적화를 위해 파생된 데이터 포함) 를 제공하며, CPU와 GPU 사이 동기화 기능을 제공합니다.
Caffe가 처리하고 전달한 실제 데이터에 대한 묶음으로 Caffe는 Blob을 사용해 데이터를 저장하고 전달합니다. 메모리 사용을 보다 효율적으로 하기 위해, 호스트와 디바이스에 필요시 느슨하게 할당됩니다.
- Layers
그림 2에서와 같이, Layer는 Net을 구성합니다.
Layer는 모델의 핵심이며 계산의 기본 단위입니다. filter를 convolve하고, pool하고, inner product를 만들고, 활성화 함수를 적용하고, 표준화하고, 데이터를 로드하고, 손실을 계산하는 역할을 수행합니다.
그림 1에서와 같이, Layer는 bottom 연결을 통해 입력을 받고, top 연결을 통해 출력합니다.
각 Layer는 setup, forward, backward의 세 가지 중요한 계산을 정의합니다.
- Setup : 모델 초기화시 Layer와 connection 초기화
- Forward : bottom으로부터 받은 입력을 계산해 top으로 출력
- Backward : top 에서는 입력에 대한 gradient를 계산하고 bottom으로 전송, 변경된 gradient는 내부적으로 저장 (출력에 대해 손실을 계산하고 gradient를 조정해 다시 학습하는 방식)
- Nets
그림 2에서와 같이, Net은 Layer들과 그 connection들로 정의됩니다.
모든 layer output의 구성은 주어진 작업을 수행하는 함수에 의해 계산되고, backward 연산은 손실로부터 gradient를 계산해 학습합니다.
일반적으로 디스크로부터 로드하는 역할의 data layer로 시작해 작업의 목표를 계산하는 역할의 loss layer로 끝납니다.
Solver
Solver는 네트워크의 forward 추론과 back gradient의 매개 변수 업데이트를 통해 손실을 개선하여 모델 최적화를 조정합니다. 특히, 매개 변수 업데이트에 책임이 있습니다.
Solver는 아래와 같은 역할을 합니다.
- 최적화 장부를 설계해 교육용 training network과 평가용 test network 제작
- forward, backward를 호출하고 매개변수를 업데이트해 반복적으로 최적화
- (주기적으로) test network 평가
- 최적화를 위해 모델 및 솔버 상태의 snapshot 생성
또한, Solver는 초기화된 모델을 학습된 상태로 만들기 위해 gradient(weight) 를 조정하면서 아래와 같은 작업을 반복합니다.
- 결과값과 손실을 계산하기 위해 네트워크를 forward로 호출
- gradient 값을 계산하기 위해 네트워크를 backward로 호출
- solver 메소드에 따라 매개 변수 업데이트에 gradient 통합
- learning rate, 이력 및 메소드에 따라 solver 상태 업데이트
Network
net은 plaintext 모델링 언어 (prototxt)로 정의된 레이어들과 그 연결들의 집합입니다.
합성과 auto-differentiation에 의해 함수와 gradient를 공동으로 정의합니다.
Caffe는 forward와 backward pass의 정확성을 보장하기 위해 모든 레이어에 대해 장부로 정리(bookkeeping) 합니다.
우선 당장 급하게 알아야 할 단어들에 대해 알아보았습니다. 길다고 생각되시면 첫줄만 읽어도 딱히 이해에 무리가 있지는 않습니다. (ɔ ˘⌣˘)˘⌣˘ c)
자꾸 밀리는거 같아 마음이 아프지만, network와 solver의 공부를 하면 할수록 자꾸 더 할게 생겨서(???) 정리가 안되고 있어서요. 제 목표는 이번달 안에 포스팅하기 입니다 하하 (´;ω;`)
중간에 다른 게시글이 생길지도 모르지만, 우선 다음 목표는 mnist 분석입니다ㅎㅅㅎ
댓글
댓글 쓰기