Caffe Tutorial : 1.Blobs, Layers, and Nets (Kor) - ys7yoo/BrainCaffe GitHub Wiki
blobs, Layers, and Nets : Anatomy of a Caffe Model)
Blobs, ๊ณ์ธต๋ค, ๊ทธ๋ฆฌ๊ณ ๋ง๋ค : Caffe ๋ชจ๋ธ ๋ถ์ (์ฌ์ธต ๋คํธ์ํฌ(deep networks)๋ ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๋ด๋ถ ์ฐ๊ฒฐ ๊ณ์ธต์ ์ง๋จ์ผ๋ก์จ ํํ๋๋ ๊ตฌ์กฐ์ ๋ชจ๋ธ์ด๋ค. Caffe๋ ๊ทธ ์์ฒด ๋ชจ๋ธ ๊ฐ์์์ ๊ณ์ธต๊ณผ ๊ณ์ธต์ ๋ง์ผ๋ก ์ ์ธํ๋ค. ์ด๋ฌํ ๋ง์ ์
๋ ฅ๋ฐ์ดํฐ์์๋ถํฐ ์์ค๊น์ง ์ ์ฒด๊ฐ ์ํฅ์(bottom to top)์ผ๋ก ์ ์๋๋ค. Caffe๋ ์ ๋ฐฉํฅ๊ณผ ์ญ๋ฐฉํฅ์ ์ฒ๋ฆฌ๋ฐฉ์์ ๋ง์ ํตํด ์ ๋๋ ํ๋ฆ๊ณผ ๋ฐ์ดํฐ๋ก์จ ์ ์ฅํ๋ฉฐ ์ํตํ๊ณ , ๊ทธ๋ฆฌ๊ณ blobs๋ก์จ ์ ๋ณด ๋ฉ์ด๋ฆฌ๋ฅผ ๋ค๋ฃฌ๋ค.
Blob๋ ํ๋ ์์ํฌ์ ๋ํ ํ์ค๋ฐฐ์ด๊ณผ ํตํฉ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ธํฐํ์ด์ค์ด๋ค. ์ด ๊ณ์ธต์ ๋ชจ๋ธ๊ณผ ๊ณ์ฐ ์์ชฝ ๋ชจ๋์ ๊ธฐ๋ฐ์ผ๋ก์จ ๋ค์์ญํ ์ ํด์ค๋ค. ๋ง์ ์์ง๊ณผ ๊ณ์ธต๊ฐ ์ฐ๊ฒฐ๋ก ์ ์๋๋ค. Blob์ ์ธ๋ถ์ฌํญ์ ๊ณ์ธต๊ณผ ๋ง ์์ด๋ ํน์ ์๋ก๋ฅผ ๊ฐ๋ก์ง๋ฅด๋ฉฐ ์ด๋ป๊ฒ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ํตํ๋์ง๋ฅผ ๋ฌ์ฌํ๋ค.
ํด๊ฒฐํ๋ ๊ฒ(Solving)์ด ์ต์ ํ์ ๋ชจ๋ธ๋ง์ ๋๋์ด ๋ถ๋ฆฌํด ๋ฐ๋ก๋ฐ๋ก ๊ตฌ์ฑํ๋ค.
์ฐ๋ฆฌ๋ ์ข ๋ ์์ธํ๊ฒ ์ด๋ฌํ ๊ตฌ์ฑ๋ค์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
1.Blob ์ ์ฅ๊ณผ ์ํต (Blob Storage and Communication)
Blob๋ Caffe๋ก ๋์๊ฐ๊ณ ์ฒ๋ฆฌ๋๋ ์ค์ ๋ฐ์ดํฐ๋ก ๋น ๋ฅด๊ฒ ์ด๋ํ๋ฉฐ, ๊ทธ๋ฆฌ๊ณ ๋ํ hood๊ฐ CPU์ GPU ์ฌ์ด์ ๋์ผํ ๋ฅ๋ ฅ์ ์ ๊ณตํ๋ค. ์ํ์ ์ผ๋ก, blob๋ C์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ ์ฅ๋ N์ฐจ์์ ๋ฐฐ์ด์ด๋ค. Caffe๋ blobs๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ํตํ๋ค. Blobs๋ ์ด๋ฏธ์ง ์ผํ ์ฒ๋ฆฌ๋, ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ ๊ทธ๋ฆฌ๊ณ ์ต์ ํ์ ๋ํ ์ ๋์ฒด๋ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ก์๋๋ ํตํฉ๋ ๋ฉ๋ชจ๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. Blob๋ ํ์ํ๋งํผ CPU ํธ์คํธ๋ถํฐ GPU ์ฅ์น๊น์ง ๋์ผํํจ์ ์ํด ๊ณ์ฐ์ ์ด๊ณ ์ง๋ฅ์ ์ผ๋ก ๋์ด์ ์ด๋ฌ๊ณผ์ ์ ํ๋ ํผํฉ๋ CPU/GPU ์์ ์ ๋ณด์ด์ง ์๊ฒํ๋ค. ํธ์คํธ์ ์ฅ์น์ ๋ฉ๋ชจ๋ฆฌ๋ ํจ์จ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ํด ์๊ตฌ๋๋ ๋งํผ ํ ๋น๋๋ค. ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์ผํ ์ฒ๋ฆฌ๋์ ๋ํ ํ์ ์ ์ฉ๋ blob ์ฐจ์์ N x K(์ฑ๋) x H(๋์ด) x W(๋ฐ๋ณ)๋ก ๋ํ๋ธ๋ค. Blob ๋ฉ๋ชจ๋ฆฌ๋ ๊ตฌ์ฑ์์ ํ ์ฐ์ ์ด๋ผ ๋ ์ชฝ/ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ฐจ์๋ถํฐ ์ ์ผ ๋น ๋ฅด๊ฒ ์ ํ๋๋ค. ์๋ฅผ ๋ค์ด, 4์ฐจ์ blob์์, ์งํ (n,k,h,w)์ธ๋ฑ์ค์ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ((n*K+k)*H+h)*W+w๋ก ๋ฐฐ์น๋๋ค.
-
์ซ์ N์ ๋ฐ์ดํฐ์ ์ผํ ์ฒ๋ฆฌ๋ ์ฌ์ด์ฆ์ด๋ค. ์ผ๊ด์ฒ๋ฆฌ๋ ์ํต๊ณผ ์ฅ์น๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์์ด ์ข ๋ ๋์ ์ฒ๋ฆฌ์จ์ ๋ฌ์ฑํ ์ ์๋ค. 256 ์ด๋ฏธ์ง ์ผํ ์ฒ๋ฆฌ๋ ํ๋ จํ๋ ์ด๋ฏธ์ง๋ง์ ๋ํ์ฌ N์ 256์ด๋ค
-
์ฑ๋ K๋ ํฅํ์ RGB์ด๋ฏธ์ง K = 3์ ๋ํ ์์ด๋ค.
๋น๋ก Caffe example์ ๋ง์ blob๋ค์ด ์ด๋ฏธ์ง ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ถ๋ค์ ๊ฐ์ง 4์ฐจ์์ผ๋ก ์ ๊ณตํ ์ง๋ผ๋, ์ด๋ฏธ์ง๊ฐ ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ํ์ฌ blob๋ค์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ ํจํ ๋ฐฉ๋ฒ์์ ์์์ผํ๋ค. ์๋ฅผ๋ค์ด ๋ง์ฝ ๊ฐ๋จํ ํ์ ์ ์ฉ๋ ๋ค์ค๊ณ์ธต ํผ์ ํธ๋ก (ํ์ต๋ฅ๋ ฅ์ ๊ฐ๋ ํจํด๋ถ๋ฅ์ฅ์น)์ ๊ฐ์ ์์ ์ ์๋ง์ด ํ์ํ๋ค๋ฉด, 2์ฐจ์ blobs (shape(N, D))์ ์ฌ์ฉํ๊ณ ์ฐ๋ฆฌ๊ฐ ํ์ ๋ค๋ฃฐ ๋ด๋ถ์์ฐ๊ณ์ธต์ ํ์๋ก ํ๋ค. ํ๋ผ๋ฏธํฐ blob ์ฐจ์๋ค์ ๊ณ์ธต์ ๊ตฌ์ฑ๊ณผ ํ์ ์ ๋ฐ๋ผ ๋ค์ํ๋ค. 11 x 11 ๊ณต๊ฐ ์ฐจ์์ ๋ํ 96๊ฐ์ ํํฐ๋ค๋ก ๊ตฌ์ฑ๋ ์ปจ๋ณผ๋ฃจ์ ๊ณ์ธต์๋ํ์ฌ 3๊ฐ ์ธํ blob๋ 96 x 3 x 11 x 11์ด ๋๋ค. 100๊ฐ ์ถ๋ ฅ ์ฑ๋๊ณผ 1024 ์ ๋ ฅ์ฑ๋๋ก ๊ตฌ์ฑ๋ ๋ด๋ถ์์ฑ / ์์ ์ ์ ๊ณ์ธต์ ํดํ์ฌ ํ๋ผ๋ฏธํฐ blob๋ 1000 x 1024์ด๋ค.
์ฌ์ฉ์ ์ง์ ๋ฐ์ดํฐ์ ๋ํ์ฌ ์ฌ์ฉ์ ์์ ๋ง์ ๋ฐ์ดํฐ ๊ณ์ธต์ด๋ ์ ๋ ฅ ์ค๋น ํด์ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค. ํ์ง๋ง ๋น์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ๋งํ๋ค๋ฉด, ๋น์ ์ด ํ ์ผ์ ๋๋๋ค. ๊ณ์ธต์ ๋ชจ๋์ฑ ๊ฐ์ ์ด ๋น์ ์ด ์ํํด์ผํ ๋๋จธ์ง ์์ ์ด๋ค.
๊ตฌํ ์ธ๋ถ์ฌํญ (Implementation Details)
์ฐ๋ฆฌ๋ ์ข ์ข blob์ ๊ธฐ์ธ๊ธฐ ๋งํผ์ด๋ ๊ฐ์ ๋ํด ํฅ๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ blob๋ โdataโ์ โdiffโ๋ผ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ์ ์ฅํ๋ค. "data"๋ ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ๋ ํ๋ฒํ ๋ฐ์ดํฐ์ด๊ณ ํ์๋ ๋คํธ์ํฌ์ ์ํด ๊ทธ๋๋์ธํธ๋ก ๊ณ์ฐ๋ ๊ฒ์ด๋ค. ์ข๋ ๋์๊ฐ ์ค์ ๊ฐ์ด CPU์ GPU ๋ชจ๋์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์. ์ด๋ค์๊ฒ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋ค. ๊ฐ์ ๋ณํํ์ง ์๋ โconstโ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ๋ณํํ๋ โmutableโ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
Const Dtype * cpu_data() const;
Dtype* mutable_cpu_data;
์ด๋ ๊ฒ ์ฝ๋ฉ์ ํ๋ ์ด์ ๋ blob๋ ๋ฐ์ดํฐ ์ ์ก์ ์ต์ํํ๊ณ ๋ํ ์ผ์ ๋์ผํํ๋ ๊ณผ์ ์ ๋ณด์ด์ง ์๊ฒ ํ๊ธฐ์ํด CPU์ GPU์ฌ์์ด ๊ฐ์ ๋์ผํํ๋ โSyncedMemโ class๋ฅผ ์ฌ์ฉํ๋ค. ๋น์ ์ด ๊ฐ์ ๋ฐ๋์ง ์๊ธธ ์ํ๋ค๋ฉด ํญ์ const๋ฅผ ์ฌ์ฉํ๋, ์ ๋ ์์ ์ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ์ง ๋ง๋ผ. ๋งค๋ฒ ๋น์ ์ด blob๋ฅผ ๋ง๋ค ๋๋ง๋ค, โSyncedMemโ์ด ์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ์ง ์ฐพ์๋ผ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋ ํจ์๋ฅผ ํ์๋กํ๋ค. ์ค์ ๋ก GPU๊ฐ ์กด์ฌํ ๋, ๋์คํฌ๋ถํฐ CPU์ฝ๋์ ์ฝ๋๊น์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ฉด์ GPU ๊ณ์ฐ์ ํ๋ ์ฅ์น ์ปค๋์ ๋ถ๋ฌ์ค๊ณ ๊ทธ๋ฆฌ๊ณ ๊ณ ๋จ๊ณ์ ์ํ์ ํ๋๋์ ์ ๋จ๊ณ์ ์ฌํญ์ ๋ฌด์ํ๋ฉด์ ๋ค์ ๊ณ์ธต์ผ๋ก blob๋ฅผ ์ ์กํ๋ค. ๋ชจ๋ ๊ณ์ธต์ด GPU์ํ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์๋ ํ, ๋ชจ๋ ์ค์๋ ๋ฐ์ดํฐ(intermediate Data)์ ๊ทธ๋๋์ธํธ๋ GPU์ ๋จ์ ๊ฒ์ด๋ค. ๋ง์ฝ blob๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ฌ ๋, ํ์ธํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์ค๋ช ๋์ด์๋ ์์ ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
// ๋ฐ์ดํฐ๊ฐ CPU์์์ ์ด๊ธฐํ ๋์๋ค๊ณ ๊ฐ์ ํ๊ณ , blob๋ฅผ ์ ์ฅํ๋ค.
const Dtype* foo;
Dtype* bar;
foo = blob.gpu_data(); // data copied cpu->gpu.
foo = blob.cpu_data(); // no data copied since both have up-to-date contents.
bar = blob.mutable_gpu_data(); // no data copied.
// ... ๊ณผ์ ์๋ต ...
bar = blob.mutable_gpu_data(); // no data copied when we are still on GPU.
foo = blob.cpu_data(); // data copied gpu->cpu, since the gpu side has modified the data
foo = blob.gpu_data(); // no data copied since both have up-to-date contents
bar = blob.mutable_cpu_data(); // still no data copied.
bar = blob.mutable_gpu_data(); // data copied cpu->gpu.
bar = blob.mutable_cpu_data(); // data copied gpu->cpu.
2.๊ณ์ธต ์ฐ์ฐ๊ณผ ์ฐ๊ฒฐ (Layer computation and connections)
๊ณ์ธต์ ๊ณ์ฐ์ ํต์ฌ์ ์ธ ๋จ์์ ๋ชจ๋ธ์ด ํ์์ ์ธ๋ฐ ๊ณ์ธต์ ํํฐ๋ค๊ณผ pool๋ก ๋๋๋ง๋ ค์์ผ๋ฉฐ, ๋ด๋ถ ์์ฐ์ ์ทจํ๊ณ , Rectified linear์ ์๊ทธ๋ชจ์ด๋, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ elementwise tramformation๊ฐ์ ๋น์ ํ์ฑ์ ์ ์ฉํ๊ณ , ์ผ๋ฐํํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ , ๊ทธ๋ฆฌ๊ณ softmax๋ hinge๊ฐ์ ์์ค์ ๊ณ์ฐํ๋ค. ๋ชจ๋ ์คํ๋ค์ ๊ณ์ธต ์นดํ๋ก๊ทธ๋ฅผ ๋ณด์๋ผ. ๋๋ถ๋ถ์ ํ์ ๋ค์ด ์๊ตฌํ๋ ์ต์ ๋ฅ๋ฌ๋ ๊ณ์ธต ์ญํ ๋ค์ด ์ฌ๊ธฐ์ ์๋ค.
์์ ๊ฐ์ ๊ณ์ธต์ bottom์ฐ๊ฒฐ์ ํตํ์ฌ ์ ๋ ฅ์ ๋ฐ๊ณ , top์ฐ๊ฒฐ์ ํตํ ์ถ๋ ฅ์ ๋ง๋ค์ด ๋ธ๋ค ๊ฐ๊ฐ์ ๊ณ์ธตํ์ ์ 3๊ฐ์ง์ ์ค์ํ ์ฐ์ฐ์ธ setup, forward, backward์ผ๋ก ์ ์๋๋ค.
- Setup : ๋ชจ๋ธ ์ด๊ธฐํ์ ๋์์ ๊ณ์ธต๊ณผ ๊ณ์ธต๊ฐ ์ฐ๊ฒฐ์ ์ด๊ธฐํํ๋ค.
- Forward : bottom์ผ๋ก๋ถํฐ ๋ฐ์ ์ ๋ ฅ์ ๊ณ์ฐํ์ฌ top์ผ๋ก ์ถ๋ ฅ์ ๋ณด๋ธ๋ค.
- Backward : top ๊ทธ๋๋์ธํธ w.r.t.๋ฅผ ์ถ๋ ฅ ๊ทธ๋๋์ธํธ w.r.t๋ฅผ ์ธํ์ผ๋ก ๊ณ์ฐํ์ฌ bottom์ผ๋ก ์ ์กํ๋ค. ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ์ฑ๋ ๊ณ์ธต์ ๊ทธ ํ๋ผ๋ฏธํฐ๋ก w.r.t.๋ฅผ ๊ณ์ฐํ์ฌ ์ด๋ฅผ ๋ด๋ถ์ ์ ์ฅํ๋ค.
์ข ๋ ์์ธํ๊ฒ Forward์ Backward ๊ธฐ๋ฅ์ ํ๋๋ CPU์์, ํ๋๋ GPU์์ ๊ณ์ฐ์ ํ ๊ฒ์ด๋ค. ๋ง์ฝ GPU ๋ฒ์ ์์ ์ํํ ์ ์๋ค๋ฉด, ๊ณ์ธต์ด ๋ฐฑ์ ์ต์ ์ผ๋ก CPU๊ธฐ๋ฅ์ผ๋ก ํํดํ๋ค. ๋น๋ก ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์ ์ก ๋น์ฉ์ด ๋ฐ์ํ๋๋ผ๋ ๋น ๋ฅธ ํ ์คํธ๋ฅผ ์ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ด ์ ์ฉํ ์๋ ์๋ค.(์ ๋ ฅ์ด GPU๋ถํฐ CPU๊น์ง ๋ณต์ฌํ ๊ฒ์ด๊ณ , ์์ํ์ด ์ญ์ผ๋ก CPU์์ GPU๊น์ง ๋ณต์ฌํ ๊ฒ์ด๋ค.) ๊ณ์ธต๋ค์ ์ ์ฒด ๋คํธ์ํฌ์ ์คํ์ ์์ด ๋๊ฐ์ง ์ค๋ํ ์๋ฌด์ด ์๋๋ฐ, ์ ๋ ฅ์ ๋ฐ์ ์ถ๋ ฅ์ ์์ฑํ๋ ์ ๋ฐฉํฅ ๊ณผ์ ๊ณผ, ์ถ๋ ฅ์ ๋ํ ๊ทธ๋๋์ธํธ๋ฅผ ์ ๋ ฅ๊ณผ ํ๋ฆฌ๋ฏธํฐ์ ๋ํ์ฌ ๊ทธ๋๋์ธํธ๋ฅผ ์ฐ์ฐํ์ฌ ์ทจํ๋ ์ญ๋ฐฉํฅ ๊ณผ์ ์ด ์๋๋ฐ ์ด๋ ์ด๊ธฐ ๊ณ์ธต์ผ๋ก back-propagated ํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ณผ์ ๋ค์ด ๊ฐ๊ฐ ๊ณ์ธต์ forward์ backward์ ๊ตฌ์กฐ์ด๋ค.
์ฌ์ฉ์ ์ ์ ๊ณ์ธต๋ค์ ๊ฐ๋ฐํ๋ ๊ฒ์ ์ฝ๋์ ๋ชจ๋์ฑ๊ณผ ๋คํธ์ํฌ์ ๊ตฌ์กฐ์ ํน์ฑ์ ์ํด ์ต์์ ๋ ธ๋ ฅ์ ํ์๋ก ํ๋ค. ๊ณ์ธต์ ๋ํ ์ค์ , ์ ๋ฐฉํฅ๊ณผ ์ญ๋ฐฉํฅ์ ์ ์ํ๋ผ. ๊ทธ ๋ค์์ ๋ง(net)์ ๋ด์ฉ์ ๋ํด์ ์ธ๊ธํ ๊ฒ์ด๋ค.
3.๋ง ์ ์์ ์๋ (Net Definition And Operation)
๋ง์ ๋ถ๋ถ์ ์ผ๋ก ํจ์์ ํจ์๊ทธ๋๋์ธํธ๋ฅผ ๊ตฌ์ฑ๊ณผ ์๋ ์ฐจ๋ณํ๋ฅผ ํตํด ์ ์ํ๋ค. ๋ชจ๋ ๊ณ์ธต์์ ์ถ๋ ฅ์ ๊ตฌ์ฑ์ ์ฃผ์ด์ง ์ญํ ์ ํ๋ ํจ์๋ฅผ ๊ณ์ฐํ๊ณ , ๋ชจ๋ ๊ณ์ธต์์ ์ญ๋ฐฉํฅ ๊ตฌ์ฑ์ ์์ค์์ ์ญํ ๋ฅผ ํ์ตํ๋ ๊ฒ๊น์ง์ ๊ทธ๋๋์ธํธ๋ฅผ ๊ณ์ฐํ๋ค. Caffe ๋ชจ๋ธ๋ค์ ์ข ๋จ ๊ธฐ๊ณํ์ต ์์ง์ด๋ค. ๋ง์ Computation graph(Direct Acyclic graph (DAG)๋ฅผ ์ฌ์ฉํ๋ค.)๋ก ์ฐ๊ฒฐ๋ ๊ณ์ธต๋ค์ ์งํฉ์ด๋ค. Caffe๋ ์ ๋ฐฉํฅ๊ณผ ์ญ๋ฐฉํฅ ๊ณผ์ ์ ์ ํ๋๋ฅผ ํ์คํ ํ๊ธฐ์ํด ๋ชจ๋ ๊ณผ์ ์ ๊ธฐ๋กํ๋ค. ์ ํ์ ์ธ ๋ง์ ๋์คํฌ์์ ํธ์ถํ๋ ๋ฐ์ดํฐ ๊ณ์ธต์ผ๋ก ์์ํด์ ๋ถ๋ฅํ๋ ๋ณต๊ตฌ ๊ฐ์ ์ญํ ์ ๋ํ ์ค๋ธ์ ํฐ๋ธ๋ฅผ ๊ณ์ฐํ๋ ์์ค ๊ณ์ธต์ผ๋ก ๋์ ๋งบ๋๋ค. ๋ง์ ๊ณ์ธต์ ์ง๋จ์ผ๋ก ์ ์ธ๋๊ณ ํ์๋ฌธ ๋ชจ๋ธ๋ง ์ธ์ด๋ก ๊ทธ๋ค์ ์ฐ๊ฒฐ์ด ์ ์๋๋ค. ๊ฐ๋จํ logistic regression classifier๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๋๋ค. http://caffe.berkeleyvision.org/tutorial/fig/logreg.jpg
name: "LogReg"
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
data_param {
source: "input_leveldb"
batch_size: 64
}
}
layer {
name: "ip"
type: "InnerProduct"
bottom: "data"
top: "ip"
inner_product_param {
num_output: 2
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip"
bottom: "label"
top: "loss"
}
๋ชจ๋ธ ์ด๊ธฐํ๋ โNet :: Init()โ๋ก ๋ค๋ฃจ์ด ์ง๋ค. ์ด๊ธฐํ๋ ์ฃผ๋ก ๋๊ฐ์ง ์ญํ ์ ํ๋ค. ๊ณ์ธต๋ค์ โSetUp()โ ๊ธฐ๋ฅ์ ํธ์ถํ๋ฉฐ, ๊ณ์ธต๋ค๊ณผ blobs๋ฅผ ์์ฑํจ์ ์ํด ์ ์ฒด DAG ๋ฐํ์ ๋ง๋ จํ๋ค. (C++ Geeks์์๋ ๋ง์ ์์กด์๊ฐ๋์ ๊ณ์ธต๊ณผ bolb์ ์์ ๊ถ์ ์ ์งํ๋ค.) ๋ํ ๋ค๋ฅธ ๊ฒ๋ค์ ์ง๋จ์ ๋ํ์ฌ ๊ณผ์ ์ ์ ๋๋ฐ ์ด๋ฅผ ํ ๋ฉด ์ ์ฒด ๋คํธ์ํฌ์ ์ค๊ณ๊ตฌ์กฐ์ ์ ํ๋๋ฅผ ์ ํจํ๊ฒ ํ๋๊ฒ๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๊ธฐ๋กํด๋๋ค. ๋, ์ด๊ธฐํํ๋๋์, ๋ง์ ๋ค์๊ณผ ๊ฐ์ INFO์ ๋ก๊น ํจ์ผ๋ก์จ ์ด๊ธฐํ๋ฅผ ์ค๋ช ํ๋ค.
I0902 22:52:17.931977 2079114000 net.cpp:39] Initializing net from parameters:
name: "LogReg"
[...model prototxt printout...]
# ๊ณ์ธต๊ฐ์ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๋ค.
I0902 22:52:17.932152 2079114000 net.cpp:67] Creating Layer mnist
I0902 22:52:17.932165 2079114000 net.cpp:356] mnist -> data
I0902 22:52:17.932188 2079114000 net.cpp:356] mnist -> label
I0902 22:52:17.932200 2079114000 net.cpp:96] Setting up mnist
I0902 22:52:17.935807 2079114000 data_layer.cpp:135] Opening leveldb input_leveldb
I0902 22:52:17.937155 2079114000 data_layer.cpp:195] output data size: 64,1,28,28
I0902 22:52:17.938570 2079114000 net.cpp:103] Top shape: 64 1 28 28 (50176)
I0902 22:52:17.938593 2079114000 net.cpp:103] Top shape: 64 (64)
I0902 22:52:17.938611 2079114000 net.cpp:67] Creating Layer ip
I0902 22:52:17.938617 2079114000 net.cpp:394] ip <- data
I0902 22:52:17.939177 2079114000 net.cpp:356] ip -> ip
I0902 22:52:17.939196 2079114000 net.cpp:96] Setting up ip
I0902 22:52:17.940289 2079114000 net.cpp:103] Top shape: 64 2 (128)
I0902 22:52:17.941270 2079114000 net.cpp:67] Creating Layer loss
I0902 22:52:17.941305 2079114000 net.cpp:394] loss <- ip
I0902 22:52:17.941314 2079114000 net.cpp:394] loss <- label
I0902 22:52:17.941323 2079114000 net.cpp:356] loss -> loss
# ์์ค์ ์ค์ ํ๊ณ ์ญ๋ฐฉํฅ ๊ณผ์ ์ ๊ตฌ์ฑํ๋ค.
I0902 22:52:17.941328 2079114000 net.cpp:96] Setting up loss
I0902 22:52:17.941328 2079114000 net.cpp:103] Top shape: (1)
I0902 22:52:17.941329 2079114000 net.cpp:109] with loss weight 1
I0902 22:52:17.941779 2079114000 net.cpp:170] loss needs backward computation.
I0902 22:52:17.941787 2079114000 net.cpp:170] ip needs backward computation.
I0902 22:52:17.941794 2079114000 net.cpp:172] mnist does not need backward computation.
# ์ถ๋ ฅ์ ๊ฒฐ์ ํ๋ค.
I0902 22:52:17.941800 2079114000 net.cpp:208] This network produces output loss
# ์ด๊ธฐํ๋ฅผ ๋ง์น๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์น๋ฅผ ๋ณด๊ณ ํ๋ค.
I0902 22:52:17.941810 2079114000 net.cpp:467] Collecting Learning Rate and Weight Decay.
I0902 22:52:17.941818 2079114000 net.cpp:219] Network initialization done.
I0902 22:52:17.941824 2079114000 net.cpp:220] Memory required for data: 201476
๋คํธ์ํฌ์ ๊ตฌ์กฐ๋ ๋จ๋ง๊ธฐ์ ์๊ด์์ด ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ์ด๋ ์์คํ ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์์์ ์ฐ๋ฆฌ๊ฐ ์ค๋ช ํ๋ ๊ฒ์ ๋์ด์ผ ๋ณด๋ฉด, bolb์ ๊ณ์ธต์ ๋ชจ๋ธ ์ ์ธ์ผ๋ก๋ถํฐ ๋ณด์ด์ง์๋ ๊ณณ์์ ์ํํ๋ ์ฌํญ๋ค์ด๋ผ๊ณ ํ์๋ค. ๊ตฌ์กฐ๋ฅผ ๋ง๋ ํ์, ๋คํธ์ํฌ๋ โCaffe::mode()โ์์์ ์ ์๋๊ณ โCaffe::set_mode()โ์์ ์ค์ ๋ ๋จ์ผ ์ค์์น๋ฅผ ์ค์ ํจ์ ์ํด์ CPU๋ GPU์์์ ์๋ํ๋ค. ๊ณ์ธต๋ค์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋ CPU์ GPUํ์ ์์ํ๋ ๊ฒ์ ๋ธ๋ ค์๋ค. (์๋ง์ ์๋ฌ๊ฐ ๋ฑ์ฅํ์ง๋ง ์ด๋ฅผ ๋ง๋ ํ ์คํธ๋ ํจ๊ปํ๋ค.) CPU/GPU ์ค์์น๋ ๋งค๋๋ฝ๊ณ ๋ชจ๋ธ ์ ์ธ์ ๋ํด ๋ ๋ฆฝ์ ์ด๋ค. ์ด๊ฒ์ ์ฐ๊ตฌ๋ ๋ฐฐ์น ๊ฐ์ ๋ค์ ์ํ์ฌ ๋ชจ๋ธ๊ณผ ์ํ์ ๋๋์ด ์ ์ํ๋ ์ต์์ ๋ฐฉ๋ฒ์ด๋ค.
๋ชจ๋ธ ํํ(Model Format)
Binary protocol buffer (binaryproto) Caffemodel files๋ก์จ ํ์ต๋ ๋ชจ๋ธ์ ๊ธ์ํ ํ๋ ๋์ ๋ชจ๋ธ์ Plaintext Protocol Buffer Schema (prototxt)๋ก ์ ์ธ๋๋ค. Model ํํ๋ caffe.proto ์์ protobuf schema์ ์ํด ์ ์๋๋ค. ์์คํ์ผ์ ๋๋ถ๋ถ ๋ผ์ธ๋ค์ด ์ค๋ช ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค. Caffe๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ ์ ๋ํ์ฌ Google Protocol Buffer๋ฅผ ์ฌ์ฉํ๋ค. Minimal-size binary strings (๊ธ์ํ ํ ๋, - Serialized), Efficient Serialization, ์์ฃผ ํ์คํ C++๊ณผ Python, ๋ค์ํ ์ธ์ด์์ ํจ์จ์ ์ธ ์ธํฐํ์ด์ค ์ํ ๊ทธ๋ฆฌ๊ณ ์ด์ง์ ๋ฒ์ ๊ณผ ์ฌ๋์ด ์ฝ์ ์ ์๋ ๊ธ ํํ์ด๋ค. ์ด๋ฌํ ๋ชจ๋ ๊ฒ๋ค์ Caffe์์ ๋ชจ๋ธ๋ง์๋ํ ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๊ธฐ์ฌํ๋ค.