Caffe Example : 1.Brewing ImageNet (Kor) - ys7yoo/BrainCaffe GitHub Wiki
(Brewing ImageNet)
์ด๋ฏธ์ง๋ง ์ง์คํ์ต์ด ๊ฐ์ด๋๋ ๋น์ ์ด ์์ ํ ๋ฐ์ดํฐ์ ๋ํ ๋น์ ๋ง์ ๋ชจ๋ธ์ ํ์ตํ ์ค๋น๊ฐ ๋์๋ค๋ํ์ ์งํํ๋ค. ๋ง์ฝ ์ด๋ฏธ์ง๋ง์ผ๋ก ํ์ต๋ ๋คํธ์ํฌ(ImageNet-trained network)๋ฅผ ์ํ๋ค๋ฉด, ํ์ต์ด ๋ง์ ์๋์ง๋ฅผ ์ทจํ๋๋ฐ ์ฐ๋ฆฌ๋ ์ง๊ตฌ์จ๋ํ๋ฅผ ์ซ์ดํ๊ธฐ๋๋ฌธ์, ์ฐ๋ฆฌ๋ CaffeNet ๋ชจ๋ธ์ model zoo์์ ์๋์๊ฐ์ด ์์ ๋๊ฒ์ผ๋ก์จ ํ์ต์์ผฐ๋ค.
๋ฐ์ดํฐ์ค๋น(Data Preparation)
์ด ๊ฐ์ด๋๋ ๋ชจ๋ ๊ณผ์ ์ ๋ช ์ํ๊ณ ๋ชจ๋ ๋ช ๋ น์ด๊ฐ Caffe root directory์์ ์คํ๋๋ค๋ ๊ฐ์ ํ๋ค. โImageNetโ์์ํด ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ ILSVRC12 challenge๋ฅผ ๋งํ์ง๋ง, ์ฝ๊ฐ์ ๋์คํฌ ๊ณต๊ฐ๊ณผ, ๋ ์ ์ ํ์ต์๊ฐ์ผ๋ก ๋น์ ์ ์ฝ๊ฒ ImageNet์ ์ ์ฒด ๋ํ ํ์ต์ํฌ์ ์๋ค.
์ฐ๋ฆฌ๋ ๋น์ ์ด ์ด๋ฏธ์ง๋ง ํ์ต๋ฐ์ดํฐ์ ์ ํจ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ํด๋์๋ค๊ณ ๊ฐ์ ํ๋ฉฐ, ์ด๋ค์ ๋น์ ์ ๋์คํฌ์์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ๋๋ค:
/path/to/imagenet/train/n01440764/n01440764_10026.JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001.JPEG
์ฐ์ ํ์ต์ ์ํด ๋ช๊ฐ์ ์๋น ๋ฐ์ดํฐ๋ฅผ ์ค๋นํด๋์ ํ์๊ฐ ์๋ค. ์ด ๋ฐ์ดํฐ๋ ๋ค์์ ์ํด ๋ค์ด๋ก๋ํ ์ ์๋ค.
./data/ilsvrc12/get_ilsvrc_aux.sh
ํ์ต์ ๋ ฅ๊ณผ ์ ํจ์ ๋ ฅ์ ๋ชจ๋ ํ์ผ๋ค๊ณผ ๊ทธ๋ค์ ๋ผ๋ฒจ๋ค์ ๋ฆฌ์คํธํ ๊ธ๋ก์ ํ train.txt์ val.txt์ ์ ํ์๋ค. ์ฐ๋ฆฌ๋ ILSVRC devkit์๋ ๋ฌ๋ฆฌ ๋ผ๋ฒจ์๋ํด ์ธ๋ฑ์ค๋ฅผ ๋งค๊ฒจ๋๋ ์๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒ์์ ์์๋์ด๋ผ. ์ฐ๋ฆฌ๋ synset์ด๋ฆ๋ค์ ๊ทธ๋ค์ ์์คํค๋ฒ์น์ ๋ฐ๋ผ ๋ถ๋ฅํ๊ณ , ๊ทธ๋ฌ๊ณ ๋์ ๊ทธ๋ค์ 0๋ถํฐ 999๊น์ง ๋ผ๋ฒจ์ ๋ถ์ธ๋ค. synset/name ๋งตํ์ ๋ํ์ฌ๋ synset_words.txt์ ๋ณด๋ผ.
๋น์ ์ ์๋ง ๋ฏธ๋ฆฌ 256x256๋ก ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ฌ์ค์ ํ๊ธธ ์ํ ๊ฒ์ด๋ค. ๋ํดํธ๊ฐ์์ํด, ์ฐ๋ฆฌ๋ ๋ฑํ ์ด๋ฅผ ํ ํ์๊ฐ ์๋๋ฐ, ์ด๋ ๊ตฐ์งํ ํ๊ฒฝ์์, mapreduce๋ฅผ ์ฌ์ฉํด์ ๋ณ๋ ฌ ๋ฐฉ์์์ ์ฌ์ค์ ํ๋ ์ด๋ฏธ์ง๋ก๋ถํฐ ์ด๋์ ์ทจํ ์ ์์์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ค๋ค์ด Yangqing์ ๊ทธ์ ๊ฒฝ๋์ mincepie ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ ๋ ๊ฐ๋จํ๊ฒ ํ๋ ๊ฒ์ ์ ํธํ๋ค๋ฉด, ๋น์ ์ ๋ํ ๋ค์๊ณผ ๊ฐ์ shell ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
for name in /path/to/imagenet/val/*.JPEG; do
convert -resize 256x256\! $name $name
done
examples/imagenet/create_imagenet.sh์ ํ๋ฒ๋ณด๋ผ. ํ์ํ๋ค๋ฉด ํ์ต๋๋ ํ ๋ฆฌ์ ์ ํจ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ , ๋ฏธ๋ฆฌ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์์ ํด๋์ง ์์๋ค๋ฉด, 256x256๋ก ๋ชจ๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ฌ์ค์ ํ๊ธฐ์ํด โRESIZE=trueโ๋ฅผ ์ค์ ํ๋ผ. ์ง๊ธ, examples/imagenet/create_imagenet.sh๋ก leveldbs๋ฅผ ๊ฐ๋จํ ๋ง๋ค์ด๋ณด์๋ผ examples/imagenet/ilsvrc12_train_leveldb์ examples/imagenet/ilsvrc12_val_leveldb๋ ์ด๋ฒ ์คํ์ ์ ์กด์ฌํ์ง ์์์ ๊ฒ์์ ์๊ณ ์์ผ๋ผ. ์ด ๋ช ๋ น๊ตฌ๋ฌธ์ผ๋ก ์์ฑ๋ ๊ฒ์ด๋ค. GLOG_logtostderr=1์ ์ ๊ฒํ๊ธฐ์ํด ๋น์ ์ ์ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ๋ฒ๋ฆด๊ฒ์ด๊ณ , ๋น์ ์ ์์ ํ๊ฒ ์ด๋ฅผ ๋ฌด์ํ ์ ์๋ค.
์ด๋ฏธ์ง ํ๊ท ์ฐ์ฐํ๊ธฐ(Compute Image Mean)
๋ชจ๋ธ์ ๋น์ ์๊ฒ ๊ฐ๊ฐ ์ด๋ฏธ์ง๋ก๋ถํฐ ์ด๋ฏธ์ง ํ๊ท ์ ๋นผ๋ผ๊ณ ์๊ตฌํ ๊ฒ์ด๊ณ , ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด ํ๊ท ์ ๊ณ์ฐํด์ผ๋งํ๋ค. tools/compute_image_mean.cpp๊ฐ ์ด๋ฅผ ์ํํ๋ค. ์ด๋ ๋ํ ์ด๋ป๊ฒ ๋ค์ค์์๋ค ์๋ฅผ๋ค๋ฉด ํ๋กํ ์ฝ ๋ฒํผ(protocol buffer)๋ leveldbs, ๊ทธ๋ฆฌ๊ณ ๋ก๊น (logging)์ ๊ฐ์ ๊ฒ๋ค์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ๊ณผ ๋น์ ์์ ์ ์น์ํ๊ฒ ํด์ค ์ข์ ์์ด๋ค. ์ด์จ๊ฑฐ๋, ํ๊ท ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ํ๋์ด์ง ์์๋ค:
./examples/imagenet/make_imagenet_mean.sh
์ด๋ data/ilsvrc12/imagenet_mean.binaryproto๋ฅผ ๋ง๋ค์ด๋ผ๊ฒ์ด๋ค.
๋ชจ๋ธ์ ์(Model definition)
์ฐ๋ฆฌ๋ Krizhevsky, Sutskever, ๊ทธ๋ฆฌ๊ณ Hinton๊ฐ ์ฒ์ NIPS 2012 paper์ ์ ์ํ ์ ๊ทผ๋ฐฉ๋ฒ์ ๋ํ์ฌ ์ฐธ์กฐ๊ตฌํ์ ์ค๋ช ํ ๊ฒ์ด๋ค.
๋คํธ์ํฌ ์ ์(models/bvlc_reference_caffenet/train_val.prototxt)๋ in Krizhevsky ์ ๊ทธ์ ๋๋ฃ๋ค์ ๊ฒ์ ๋ฐ๋ฅธ๋ค. ๋ง์ฝ ๋น์ ์ด ์ด ๊ฐ์ด๋์์ ์ ์ํ ํ์ผ ๊ฒฝ๋ก๋ก๋ถํฐ ๋ฒ์ด๋๋ค๋ฉด, ๋น์ ์ .prototxt ํ์ผ๋ค์์ ์ ์ ํ ๊ฒฝ๋ก๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์์์ ์ ์ํ๋ผ.
๋ง์ฝ ๋น์ ์ด ์ ์ฌํ models/bvlc_reference_caffenet/train_val.prototxt๋ฅผ ๋ณด์๋ค๋ฉด, phase: TRAIN์ด๋ ํน์ phase: TEST ๋ ์ค ํ๋๋ฅผ ๋ช ์ํ include ์ธ์ ๋ค ๋ณผ ๊ฒ์ด๋ค. ์ด๋ฌํ ์ธ์ ๋ค์ ํ ํ์ผ์์ ์ฐ๋ฆฌ์๊ฒ ๋์ด ๊ฐ๊น๊ฒ ์ฐ๊ด๋ ๋คํธ์ํฌ๋ค(ํ์ต์ฉ์ผ๋ก ์ฌ์ฉ๋๋ ๋คํธ์ํฌ์ ์คํ์ฉ์ผ๋ก ์ฌ์ฉ๋๋ ๋คํธ์ํฌ)์ ์ ์ํ ์ ์๊ฒ ํด์ค๋ค. ์ด๋ฌํ ๋ ๋คํธ์ํฌ๋ค์ include { phase: TRAIN }์ด๋ include { phase: TEST }๋ก ์ ํ ๊ฒ๋ค์ ์ ์ธํ๊ณ ๋ชจ๋ ๊ณ์ธต๋ค์ ๊ณต์ ํ์ฌ ๊ฑฐ์ ๋์ผํ๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์์, ๋จ์ผ ์ ๋ ฅ ๊ณ์ธต๊ณผ ํ๋์ ์ถ๋ ฅ ๊ณ์ธต์ ๋ค๋ฅด๋ค.
- ์ ๋ ฅ๊ณ์ธต ์ฐจ์ด์ (Input layer differences)
ํ์ต ๋คํธ์ํฌ์ ๋ฐ์ดํฐ ์ ๋ ฅ ๊ณ์ธต์ examples/imagenet/ilsvrc12_train_leveldb๋ก๋ถํฐ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉฐ ๋๋ค์ผ๋ก ์ ๋ ฅ์ด๋ฏธ์ง๋ฅผ ๋ฏธ๋ฌ๋งํ๋ค. ์คํ ๋คํธ์ํฌ์ ๋ฐ์ดํฐ ๊ณ์ธต์ examples/imagenet/ilsvrc12_val_leveldb์์ ๋ฐ์ดํฐ๋ฅผ ์ทจํ์ง๋ง ๋๋ค ๋ฏธ๋ฌ๋ง์ ์ํํ์ง ์๋๋ค.
- ์ถ๋ ฅ๊ณ์ธต ์ฐจ์ด์ (Output layer differences)
๋ ๋คํธ์ํฌ ๋ชจ๋ softmax_loss ๊ณ์ธต์ ์ถ๋ ฅํ๋ฉฐ, ์ด๋ ํ์ต์์ ์์ค ํจ์๋ฅผ ์ฐ์ฐํ๊ณ backpropagation์ ์ด๊ธฐํํ๋๋ฐ ์ฌ์ฉ๋๋ฉฐ, ๋ฐ๋ฉด์ ์ ํจ์์๋ ์ด ์์ค์ ๊ฐ๋จํ ๋ณด๊ณ ๋ง ํ๋ค. ์คํ ๋คํธ์ํฌ๋ ๋ํ ๋๋ฒ์งธ ์ถ๋ ฅ ๊ณ์ธต, ์ ํ๋๋ฅผ ์ง๋๊ณ ์๊ณ , ์ด๋ ์คํ ์ธํธ์ ๋ํ ์ ํ๋๋ฅผ ๋ณด๊ณ ํ๋๋ฐ๋ง ์ฌ์ฉ๋๋ค. ํ์ต๊ณผ์ ์์, ์คํ ๋คํธ์ํฌ๋ ๋๋๋ก ์๋ฅผ๋ค๋ฉฐ ์ค๋ช ํ ๊ฒ์ด๊ณ Test score #0: xxx ์ด๋ Test score #1: xxx์ ๊ฐ์ ์ค์ ์์ฑํ๋ฉด์ ์คํ ์ธํธ์ ๋ํ์ฌ ์คํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ, ์ค์ฝ์ด 0์ ์ ํ๋์ด๋ฉฐ(์ด ์ ํ๋๋ ํ์ต๋์ง ์์ ๋คํธ์ํฌ์ ๋ํ์ฌ 1/1000 = 0.001 ์ฃผ๋ณ์์ ์์ํ๋ค), ๊ทธ๋ฆฌ๊ณ ์ค์ฝ์ด 1์ ์์ค์ด๋ค(์ด ์์ค์ ํ์ต๋์ง์์ ๋คํธ์ํฌ์ ๋ํ์ฌ ์ฝ 7 ์ฃผ๋ณ์์ ์์ํ ๊ฒ์ด๋ค.).
์ฐ๋ฆฌ๋ ๋ํ ํด๊ฒฐ์ฌ๋ฅผ ์คํํ๊ธฐ ์ํ ํ๋กํ ์ฝ ๋ฒํฐ๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค. ๊ณํ์ ์ธ์๋ณด์:
- ์ฐ๋ฆฌ๋ 256์ ์ผํ์ฒ๋ฆฌ๋์ผ๋ก ์คํํ ๊ฒ์ด๊ณ , ์ ์ฒด 450,000๋ง๋ฒ์ ๋ฐ๋ณต (์ฝ 90ํ์ ์์ฝ)์ ์คํํ ๊ฒ์ด๋ค.
- ๋งค 1000๋ฒ ๋ฐ๋ณต๋ง๋ค ์ฐ๋ฆฌ๋ ์ ํจ ๋ฐ์ดํฐ์ ๋ํ์ฌ ํ์ต๋ ๋ง์ ์คํํ๋ค.
- ์ฐ๋ฆฌ๋ ์ด๊ธฐ ํ์ต์จ์ 0.01๋ก ์ค์ ํ๊ณ , ์ด๋ฅผ ๋งค 100,000๋ง๋ฒ (์ฝ 20ํ์ ์์ฝ)์์ ๊ฐ์ํ ๊ฒ์ด๋ค.
- ์ ๋ณด๋ค์ ๋งค 20ํ ๋ฐ๋ณต๋ง๋ค ๋ณด์ฌ์ง ๊ฒ์ด๋ค.
- ๋คํธ์ํฌ๋ ๋ชจ๋ฉํ 0.9 ๊ทธ๋ฆฌ๊ณ 0.0005์ ๊ฐ์ค์น ๊ฐ์๋ก ํ์ต๋ ๊ฒ์ด๋ค.
- ๋งค 10,000๋ฒ ๋ฐ๋ณต๋ง๋ค, ์ฐ๋ฆฌ๋ ํ์ฌ ์ํ์ ์ค๋ ์ท์ ์ฐ์ ๊ฒ์ด๋ค.
๊ด์ฐฎ์ ๋ณด์ด์ง? ์ด๋ models/bvlc_reference_caffenet/solver.prototxt.์ ๊ตฌํ๋์ด์๋ค.
์ด๋ฏธ์ง๋ง ํ์ตํ๊ธฐ(Training ImageNet)
์ค๋น๋ฌ์ง? ์์ํด๋ณด์.
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt
์ด์ ์ฆ๊ฒจ๋ณด๋ผ๊ณ !
K40 ๋จธ์ ์์์๋, ๋งค 20ํ ๋ฐ๋ณต๋ง๋ค (K20๋จธ์ ์์์๋ 36์ด๊ฐ ๊ฑธ๋ฆฌ๋๋ฐ ๋นํด) ์คํํ๋๋ฐ ์ฝ 26.5์ด๊ฐ ๊ฑธ๋ฆฌ๋ฉฐ, ๋งค์ฐ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฐฉํฅ-์ญ๋ฐฉํฅ ๊ณผ์ ๋ชจ๋์ ๋ํ์ฌ ์ด๋ฏธ์ง๋น ์ฝ 5.2 ms๊ฐ ๊ฑธ๋ฆฐ๋ค. ์ฝ 2 ms๊ฐ ์ ๋ฐฉํฅ์ ์ฌ์ฉ๋๊ณ , ๋๋จธ์ง๋ ์ญ๋ฐฉํฅ์์ ์ฌ์ฉ๋๋ค. ๋ง์ฝ ์ด ์ฐ์ฐ์๊ฐ์ ํด๋ถํ๋๋ฐ ํฅ๋ฏธ๊ฐ์๋ค๋ฉด, ๋ค์์ ์คํ์์ผ๋ณผ ์ ์๋ค.
./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt
ํ์ต์ฌ๊ฐ?(Resume Training?)
์ฐ๋ฆฌ๋ ๋ชจ๋ ํ์๊ฐ ๋๊ฐ๋๋ฅผ ๊ฒฝํํด๋ดค๊ฑฐ๋ ๋ฐฐํํ๋๋ฅผ ์ฆ๊น์ผ๋ก์จ ๊ฑฐ์ ์ฐ๋ฆฌ์์ ์ ๊ฐ์น์๊ฒ ๋ณด๋์์ง์์ ๊ฒ ๊ฐ์ด ๋๊ผ๋ค(๋๊ตฌ ํ์ดํฌ๋ฅผ ์์ง๋ ๊ธฐ์ตํ๋ ์ด๊ฐ ์๋๊ฐ?). ์ฐ๋ฆฌ๊ฐ ํ์ต์ค์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ ์ท์ผ๋ก ์ฐ๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ์ค๋ ์ท์์ ๋ถํฐ ์ฌ๊ฐํ ์ ์๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์ํ๋ ์ ์๋ค.
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
์คํฌ๋ฆฝํธ์์ caffenet_train_iter_10000.solverstate๋ ์ ํํ ํด๊ฒฐ์ฌ ์ํ๋ฅผ ๋ณต๊ตฌํ๋ ๋ชจ๋ ํ์์ ์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ํด๊ฒฐ์ฌ ์ํ ์ค๋ ์ท์ด๋ค.
์๋ณ์ธ์ฌ(Parting Words)
๋น์ ์ด ์ด ๋ ์ํผ๋ฅผ ์ข์ํ๊ธฐ๋ฅผ ํฌ๋งํ๋ค! ๋คํธ์ํฌ์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋ฉด์ ๊ทธ๋ฆฌ๊ณ /ํน์ ์๋ก์ด ๋ฐ์ดํฐ์ ์ ๋ฌด๋ฅผ ๋ณด๋ด๋ ค๋ ๋คํธ์ํฌ๋ด์ ๋ค์ํ ํ๋ผ๋ฏธํฐ๋ค์ ์ ์กฐ์จํ๋ฉด์, ILSVRC 2012 challenge์ด๋๋ก ๋ง์ ์ฐ๊ตฌ์๋ค์ ๋์ฑ ์ง์ ํ๋ค. ๊ฐ๋จํ ์ ์ ๋ค์ํ prototxt ํ์ผ๋ค์์ํด Caffe๊ฐ ๋น์ ์ ๋ค์ํ ๋คํธ์ํฌ ์ ํ์ ์ข ๋ ์ฝ๊ฒ ํ์ํ๋๋ก ํ์ฌ๋ผ. - ํฅ๋ฏธ๋กญ์ง ์์?
๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ๋คํธ์ํฌ๋ฅผ ๋ง ํ๋ จ์์ผฐ๊ธฐ ๋๋ฌธ์, classifying ImageNet์ ๋ํ Python ์ธํฐํ์ด์ค๋ก๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ํ์ธํด๋ณด๋ผ