Caffe Example : 8.Siamese Network Training with Caffe (Kor) - ys7yoo/BrainCaffe GitHub Wiki

Caffe๋ฅผ ์ด์šฉํ•œ ์ƒด ๋„คํŠธ์›Œํฌ ํ•™์Šตํ•˜๊ธฐ (Siamese Network Training with Caffe)

์ด ์˜ˆ์‹œ๋Š” Caffe์—์„œ ์ƒด ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๊ธฐ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ค‘์น˜ ๊ณต์œ ์™€ ๋Œ€์กฐํ•˜๋Š” ์†์‹คํ•จ์ˆ˜์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

์šฐ๋ฆฌ๋Š” Caffe๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ปดํŒŒ์ผ ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๊ฒƒ์ด๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด, ์„ค์น˜ํŽ˜์ด์ง€ใ„น๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค. ์ด ์˜ˆ์‹œ๋Š” MNIST ์ž…๋ฌธ์„œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณ„์†ํ•˜๊ธฐ์ „์—, ์ด๊ฑธ ๋จผ์ € ์ฝ๊ณ  ์˜ค๋Š”๊ฒŒ ์ข‹์„๊ฒƒ์ด๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋“ค์„ ๋ช…์‹œํ•˜๊ณ  ๋ชจ๋“  ๋ช…๋ น์–ด๋“ค์€ Caffe root ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹คํ–‰๋˜์–ด์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ์„ธํŠธ ์ค€๋น„ํ•˜๊ธฐ(Prepare Datasets)

๋‹น์‹ ์€ ์ฒ˜์Œ์— MNIST ์›น์‚ฌ์ดํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ๋ฐ›๊ณ  ์ „ํ™˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ์œ„ํ•ด์„œ๋Š”, ๊ฐ„๋‹จํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ผ:

./data/mnist/get_mnist.sh
./examples/siamese/create_mnist_siamese.sh

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œํ›„ ๋‘๊ฐœ์˜ ๋ฐ์ดํ„ฐ์„ธํŠธ ./examples/siamese/mnist_siamese_train_leveldb์™€ ./examples/siamese/mnist_siamese_test_leveldb๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋ชจ๋ธ(The Model)

์ฒ˜์Œ์—, ์šฐ๋ฆฌ๋Š” ์ƒด ๋„คํŠธ์›Œํฌ๋ฅผ์‚ฌ์šฉํ•ด ํ•™์Šตํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ชจ๋ธ์„ ์ •์˜ํ•  ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ./examples/siamese/mnist_siamese.prototxt์— ์ •์˜๋œ ์ปจ๋ณผ๋ฃจ์…˜ ๋ง์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ์ด ๋ชจ๋ธ์€ ๊ฑฐ์˜ ์ •ํ™•ํ•˜๊ฒŒ LeNet ๋ชจ๋ธ๊ณผ ์ผ์น˜ํ•˜๋Š”๋ฐ, ์˜ค์ง ํ•œ๊ฐ€์ง€ ๋‹ค๋ฅธ์ ์€ 2์ฐจ์› ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์„ ํ˜• "ํŠน์ง•" ๊ณ„์ธต์œผ๋กœ 10๊ฐœ์˜ ์ˆซ์ž ํด๋ž˜์Šค ์ด์ƒ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ƒ์‚ฐํ•˜๋Š” ์ƒ์œ„ ๊ณ„์ธต์„ ๋Œ€์ฒดํ•ด์˜จ๊ฒƒ์ด๋‹ค.

layer {
  name: "feat"
  type: "InnerProduct"
  bottom: "ip2"
  top: "feat"
  param {
    name: "feat_w"
    lr_mult: 1
  }
  param {
    name: "feat_b"
    lr_mult: 2
  }
  inner_product_param {
    num_output: 2
  }
}

์ƒด ๋„คํŠธ์›Œํฌ ์ •์˜ (Define the Siamese Network)

์ด ์„น์…˜์—์„œ๋Š” ์šฐ๋ฆฐ ํ•™์Šต์— ์‚ฌ์šฉ๋  ์ƒด ๋„คํŠธ์›Œํฌ๋ฅผ ์ •์˜ํ•  ๊ฒƒ์ด๋‹ค. ๋„์ถœ๋˜๋Š” ๋„คํŠธ์›Œํฌ๋Š” ./examples/siamese/mnist_siamese_train_test.prototxt์— ์ •์˜๋˜์–ด์ ธ์žˆ๋‹ค. In this section we will define the siamese network used for training. The resulting network is defined in ./examples/siamese/mnist_siamese_train_test.prototxt.

๋ฐ์ดํ„ฐ ์Œ ์ฝ์–ด๋“ค์ด๊ธฐ(Reading in the Pair Data)

์šฐ๋ฆฌ๋Š” ์ดˆ๊ธฐ์— ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ LevelDB ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์ฝ์€ ๋ฐ์ดํ„ฐ๊ณ„์ธต์„ ๊ฐ€์ง€๊ณ  ์‹œ์ž‘ํ•œ๋‹ค. ์ด ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๊ฐ๊ฐ ๋‚ด์šฉ์€ ํ•œ ์Œ์˜ ์ด๋ฏธ์ง€๋“ค (pair_data)์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€์™€ ์ด๋ฏธ์ง€๋“ค์ด ๊ฐ™์€ ํด๋ž˜์Šค์—์ธ์ง€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์— ๊ฑธ๋ ค์žˆ๋Š”์ง€ ๋งํ•ด์ฃผ๋Š” ์ด์ง„์ˆ˜ ๋ผ๋ฒจ(sim)์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

layer {
  name: "pair_data"
  type: "Data"
  top: "pair_data"
  top: "sim"
  include { phase: TRAIN }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/siamese/mnist_siamese_train_leveldb"
    batch_size: 64
  }
}

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐ™์€ blob์†์—๋‹ค ํ•œ ์Œ์— ์ด๋ฏธ์ง€๋ฅผ ํฌ์žฅํ•˜๊ธฐ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ํ•œ ์ฑ„๋„๋‹น ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ํฌ์žฅํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋‘๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๊ณ„์ธต ๋‹ค์Œ์— ์ž๋ฅด๊ธฐ ๊ณ„์ธต(slice layer)์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด๋Š” pair_data๋ฅผ ๊ฐ€์ง€๊ณ ์™€์„œ ์ฑ„๋„์˜ ์ฐจ์›์ˆ˜์— ๋”ฐ๋ผ pair_data๋ฅผ ์ž˜๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋‚ด ๋‹จ์ผ ์ด๋ฏธ์ง€์™€ data_p์† ๋ฐ์ดํ„ฐ์˜ ์Œ์œผ๋กœ ๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง„๋‹ค

layer {
  name: "slice_pair"
  type: "Slice"
  bottom: "pair_data"
  top: "data"
  top: "data_p"
  slice_param {
    slice_dim: 1
    slice_point: 1
  }
}

์ƒด ๋ง์˜ ๋‘๋ฒˆ์งธ ์‚ฌ์ด๋“œ ๊ตฌ์ถ•(Building the Second Side of the Siamese Net)

์ด์ œ ์šฐ๋ฆฌ๋Š” data_p์—์„œ ์ž‘๋™ํ•˜๊ณ  feat_p๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‘๋ฒˆ์งธ ๊ฒฐ๋กœ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€์žˆ๋‹ค. ์ด ๊ฒฐ๋กœ๋Š” ์ •ํ™•ํžˆ ์ฒ˜์Œ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๋ƒฅ ์ด๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ๋ถ™์—ฌ๋„ฃ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ ๋‚˜๋ฉด ๊ธฐ์กด์˜ ๊ฒƒ๊ณผ ์Œ์œผ๋กœ ๋œ(paired) ๊ณ„์ธต๋“ค์„ ์ฐจ๋ณ„ํ•˜๊ธฐ์œ„ํ•ด _p๋ฅผ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ ์šฐ๋ฆฌ๋Š” ๊ฐ๊ฐ์˜ ๊ณ„์ธต, ์ž…๋ ฅ, ๊ทธ๋ฆฌ๊ณ  ์ถœ๋ ฅ์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค.

๋Œ€์กฐํ•˜๋Š” ์†์‹ค ํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ธฐ(Adding the Contrastive Loss Function)

๋„คํŠธ์›Œํฌ๋ฅผ ํ•™์Šตํ•˜๊ธฐ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” Raia Hadsell, Sumit Chopra, ๊ทธ๋ฆฌ๊ณ  Yann LeCun์ด ์ €์ˆ ํ•œ "๋ณ€ํ•˜์ง€์•Š๋Š” ๋งตํ•‘์„ ํ•™์Šตํ•จ์œผ๋กœ ์ฐจ์›๊ฐ€๋Šฅ์„ฑ ์ œ๊ฑฐํ•˜๊ธฐ(Dimensionality Reduction by Learning an Invariant Mapping)"์—์„œ ์ œ์‹œํ–ˆ๋˜ ๋Œ€์กฐํ•˜๋Š” ์†์‹คํ•จ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•  ๊ฒƒ์ด๋‹ค. ์ด ์†์‹คํ•จ์ˆ˜๋Š” ๋งค์น˜๋˜์ง€ ๋ชปํ•˜๋Š” ์Œ๋“ค์„ ๋ฐ€์–ด๋ƒ„๊ณผ ๋™์‹œ์— ํŠน์ง• ๊ณต๊ฐ„์—์„œ ์„œ๋กœ๋ฅผ ๊ฐ€๊น๊ฒŒํ•˜๊ธฐ์œ„ํ•ด ์Œ์„ ๋งค์นญํ•˜๋„๋ก ๋•๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ๋น„์šฉ ํ•จ์ˆ˜๋Š” CONTRASTIVE_LOSS๊ณ„์ธต์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.

layer {
    name: "loss"
    type: "ContrastiveLoss"
    contrastive_loss_param {
        margin: 1.0
    }
    bottom: "feat"
    bottom: "feat_p"
    bottom: "sim"
    top: "loss"
}

ํ•ด๊ฒฐ์‚ฌ ์ •์˜ํ•˜๊ธฐ(Define the Solver)

์•Œ๋งž๋Š” ๋ชจ๋ธ ํŒŒ์ผ์— ์ด๋ฅผ ์ง€์ ํ•˜๊ธฐ๋งŒ ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ์‚ฌ๋ฅผ ์ •์˜ํ•˜๊ธฐ์œ„ํ•ด ํŠน๋ณ„ํžˆ ํ•ด์ค„์ผ์€ ์—†๋‹ค. ํ•ด๊ฒฐ์‚ฌ๋Š” ./examples/siamese/mnist_siamese_solver.prototxt์— ์ •์˜๋˜์–ด์žˆ๋‹ค.

๋ชจ๋ธ ํ•™์Šต ๋ฐ ์‹คํ—˜(Training and Testing the Model)

๋ชจ๋ธ ํ•™์Šต์€ ๋‹น์‹ ์ด ๋„คํŠธ์›Œํฌ ์ •์˜ protobuf์™€ ํ•ด๊ฒฐ์‚ฌ protobuf ํŒŒ์ผ๋“ค์„ ์ž‘์„ฑํ•ด์˜จ ํ›„๋ผ๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค. ๊ฐ„๋‹จํžˆ ./examples/siamese/train_mnist_siamese.sh๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

./examples/siamese/train_mnist_siamese.sh

๊ฒฐ๊ณผ ํ”Œ๋ผํŒ…(Plotting the results)

์ฒ˜์Œ์— ์šฐ๋ฆฌ๋Š” .prototxt ํŒŒ์ผ๋“ค์— ์ •์˜๋œ DAGs๋ฅผ ๊ทธ๋ ค์ฃผ๋Š” ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰์‹œ์ผœ์คŒ์œผ๋กœ์จ ๋ชจ๋ธ๊ณผ ์ƒด ๋„คํŠธ์›Œํฌ๋ฅผ ๊ทธ๋ฆด์ˆ˜์žˆ๋‹ค.

./python/draw_net.py \
    ./examples/siamese/mnist_siamese.prototxt \
    ./examples/siamese/mnist_siamese.png

./python/draw_net.py \
    ./examples/siamese/mnist_siamese_train_test.prototxt \
    ./examples/siamese/mnist_siamese_train_test.png

๋‹ค์Œ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ํ•™์Šต๋œ ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์„œ iPython ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•œ ํŠน์ง•๋“ค์„ ํ”Œ๋ผํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค.

ipython notebook ./examples/siamese/mnist_siamese.ipynb