Keras: caffe ๋ชจ๋ธ์„ Keras ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2015๋…„ 05์›” 14์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: keras-team/keras

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

Keras๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•ด CNN ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ๋ฐ”์™€ ๊ฐ™์ด VGG, ImageNet ๋“ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๊ณต๊ฐœ CNN ๋ชจ๋ธ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถˆํ–‰ํžˆ๋„ ์ด๋Ÿฌํ•œ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์€ caffe ๋˜๋Š” cuda-convnet๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ CNN ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‚ฌ์ „ ํ›ˆ๋ จ๋œ ๋ชจ๋ธ ๋˜๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Keras ์ˆœ์ฐจ ๋ชจ๋ธ์„ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ ๋ฏธ์„ธ ์กฐ์ • ํ›ˆ๋ จ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”
์šฐ ๋ฐ•์‚ฌ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ณง ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. https://github.com/fchollet/keras/issues/100

๋ชจ๋“  10 ๋Œ“๊ธ€

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ๋ณด๊ธฐ๋ฅผ ํฌ๋งํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ณง ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. https://github.com/fchollet/keras/issues/100

์—ฌ์ „ํžˆ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๋ณ€ํ™˜ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ์ด Keras ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/MarcBS/keras

์ตœ์ƒ์˜,
๋งˆํฌ

์•ˆ๋…•,
๋‚˜๋Š” ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ caffe์—์„œ keras ๋ณ€ํ™˜ ๋ชจ๋“ˆ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ caffe2keras.py๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ „์—ญ ์ด๋ฆ„ 'network_input'์ด(๊ฐ€) ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์…จ๋‚˜์š”?

@dhruvjain ์ด ํฌํฌ ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ๊ธฐ ์—์„œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

๋˜ํ•œ ๋ณ€ํ™˜ํ•˜๋ ค๋Š” ๋ชจ๋ธ ํŒŒ์ผ์ด๋‚˜ ์ตœ์†Œํ•œ .prototxt๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

caffenet ๋ชจ๋ธ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ prototxt๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๋ฆ„: "์นดํŽ˜๋„ท"

force_backward: ์ฐธ
์ž…๋ ฅ ๋ฐ์ดํ„ฐ"
input_dim: 1
input_dim: 3
input_dim: 227
input_dim: 227

์ž…๋ ฅ: "๋ ˆ์ด๋ธ”"
input_dim: 1
input_dim: 1
input_dim: 1
input_dim: 1

์ธต {
์ด๋ฆ„: "conv1"
์œ ํ˜•: "์ปจ๋ณผ๋ฃจ์…˜"
ํ•˜๋‹จ: "๋ฐ์ดํ„ฐ"
์ƒ๋‹จ: "conv1"
convolution_param {
num_์ถœ๋ ฅ: 96
์ปค๋„ ํฌ๊ธฐ: 11
๋ณดํญ: 4
}
}

์ธต {
์ด๋ฆ„: "relu1"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "conv1"
์ƒ๋‹จ: "conv1"
}
์ธต {
์ด๋ฆ„: "pool1"
์œ ํ˜•: "ํ’€๋ง"
ํ•˜๋‹จ: "conv1"
์ƒ๋‹จ: "pool1"
pooling_param {
ํ’€: ์ตœ๋Œ€
์ปค๋„ ํฌ๊ธฐ: 3
๋ณดํญ: 2
}
}
์ธต {
์ด๋ฆ„: "norm1"
์œ ํ˜•: "LRN"
ํ•˜๋‹จ: "pool1"
์ƒ๋‹จ: "norm1"
lrn_param {
๋กœ์ปฌ ํฌ๊ธฐ: 5
์•ŒํŒŒ: 0.0001
๋ฒ ํƒ€: 0.75
}
}
์ธต {
์ด๋ฆ„: "conv2"
์œ ํ˜•: "์ปจ๋ณผ๋ฃจ์…˜"
ํ•˜๋‹จ: "norm1"
์ƒ๋‹จ: "conv2"
convolution_param {
num_์ถœ๋ ฅ: 256
ํŒจ๋“œ: 2
์ปค๋„ ํฌ๊ธฐ: 5
๊ทธ๋ฃน: 2
}
}
์ธต {
์ด๋ฆ„: "relu2"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "conv2"
์ƒ๋‹จ: "conv2"
}
์ธต {
์ด๋ฆ„: "pool2"
์œ ํ˜•: "ํ’€๋ง"
ํ•˜๋‹จ: "conv2"
์ƒ๋‹จ: "pool2"
pooling_param {
ํ’€: ์ตœ๋Œ€
์ปค๋„ ํฌ๊ธฐ: 3
๋ณดํญ: 2
}
}
์ธต {
์ด๋ฆ„: "norm2"
์œ ํ˜•: "LRN"
ํ•˜๋‹จ: "pool2"
์ƒ๋‹จ: "norm2"
lrn_param {
๋กœ์ปฌ ํฌ๊ธฐ: 5
์•ŒํŒŒ: 0.0001
๋ฒ ํƒ€: 0.75
}
}
์ธต {
์ด๋ฆ„: "conv3"
์œ ํ˜•: "์ปจ๋ณผ๋ฃจ์…˜"
ํ•˜๋‹จ: "norm2"
์ƒ๋‹จ: "conv3"
convolution_param {
num_์ถœ๋ ฅ: 384
ํŒจ๋“œ: 1
์ปค๋„ ํฌ๊ธฐ: 3
}
}
์ธต {
์ด๋ฆ„: "relu3"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "conv3"
์ƒ๋‹จ: "conv3"
}
์ธต {
์ด๋ฆ„: "conv4"
์œ ํ˜•: "์ปจ๋ณผ๋ฃจ์…˜"
ํ•˜๋‹จ: "conv3"
์ƒ๋‹จ: "conv4"
convolution_param {
num_์ถœ๋ ฅ: 384
ํŒจ๋“œ: 1
์ปค๋„ ํฌ๊ธฐ: 3
๊ทธ๋ฃน: 2
}
}
์ธต {
์ด๋ฆ„: "relu4"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "conv4"
์ƒ๋‹จ: "conv4"
}
์ธต {
์ด๋ฆ„: "conv5"
์œ ํ˜•: "์ปจ๋ณผ๋ฃจ์…˜"
ํ•˜๋‹จ: "conv4"
์ƒ๋‹จ: "conv5"
convolution_param {
num_์ถœ๋ ฅ: 256
ํŒจ๋“œ: 1
์ปค๋„ ํฌ๊ธฐ: 3
๊ทธ๋ฃน: 2
}
}
์ธต {
์ด๋ฆ„: "relu5"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "conv5"
์ƒ๋‹จ: "conv5"
}
์ธต {
์ด๋ฆ„: "pool5"
์œ ํ˜•: "ํ’€๋ง"
ํ•˜๋‹จ: "conv5"
์ƒ๋‹จ: "pool5"
pooling_param {
ํ’€: ์ตœ๋Œ€
์ปค๋„ ํฌ๊ธฐ: 3
๋ณดํญ: 2
}
}
์ธต {
์ด๋ฆ„: "fc6"
์œ ํ˜•: "๋‚ด๋ถ€ ์ œํ’ˆ"
ํ•˜๋‹จ: "pool5"
์ƒ๋‹จ: "fc6"
inner_product_param {
num_์ถœ๋ ฅ: 4096
}
}
์ธต {
์ด๋ฆ„: "relu6"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "fc6"
์ƒ๋‹จ: "fc6"
}
์ธต {
์ด๋ฆ„: "drop6"
์œ ํ˜•: "์ค‘๋‹จ"
ํ•˜๋‹จ: "fc6"
์ƒ๋‹จ: "fc6"
dropout_param {
dropout_ratio: 0.5
}
}
์ธต {
์ด๋ฆ„: "fc7"
์œ ํ˜•: "๋‚ด๋ถ€ ์ œํ’ˆ"
ํ•˜๋‹จ: "fc6"
์ƒ๋‹จ: "fc7"
inner_product_param {
num_์ถœ๋ ฅ: 4096
}
}

์ธต {
์ด๋ฆ„: "relu7"
์œ ํ˜•: "ReLU"
ํ•˜๋‹จ: "fc7"
์ƒ๋‹จ: "fc7"
}

์ธต {
์ด๋ฆ„: "drop7"
์œ ํ˜•: "์ค‘๋‹จ"
ํ•˜๋‹จ: "fc7"
์ƒ๋‹จ: "fc7"
dropout_param {
dropout_ratio: 0.5
}
}

์ธต {
์ด๋ฆ„: "fc8"
์œ ํ˜•: "๋‚ด๋ถ€ ์ œํ’ˆ"
ํ•˜๋‹จ: "fc7"
์ƒ๋‹จ: "fc8"
inner_product_param {
num_์ถœ๋ ฅ: 1000
}
}

์ •๋ง ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ...

์ด Caffe-to-Keras ๊ฐ€์ค‘์น˜ ๋ณ€ํ™˜๊ธฐ๋Š” ๋‹น์‹ ์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

https://github.com/pierluigiferrari/caffe_weight_converter

.caffemodel ํŒŒ์ผ์„ .h5 ๊ฐ€์ค‘์น˜ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์ •์˜๊ฐ€ ์•„๋‹Œ ๊ฐ€์ค‘์น˜๋งŒ ๋ณ€ํ™˜ํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ๊ฐ€์ค‘์น˜๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋ชจ๋ธ ์ •์˜๋Š” Keras ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ ˆ์ด์–ด๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ˆ˜๋™์œผ๋กœ Keras๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ๊ฑฐ๋‚˜ ๋ชจ๋ธ ์ •์˜๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ๋ ˆ์ด์–ด ์œ ํ˜•์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋ธ ์ •์˜ ๋ณ€ํ™˜๊ธฐ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„.

๋ณ€ํ™˜๋œ ์ƒˆ keras ๋ชจ๋ธ์—์„œ ์˜ˆ์ƒ๋˜๋Š” ๋ชจ์–‘ ์ž…๋ ฅ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (3,224,224) ๋˜๋Š” (224,224,3)? caffe๋Š” (3,224,224)์™€ keras๋Š” (224,224,3)๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์—...

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰