Caffe Tutorial : 5.Layer Catalogue (Kor) - ys7yoo/BrainCaffe GitHub Wiki

๊ณ„์ธต (Layers)

Caffe ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด, Protocol Buffer Definition file (prototxt)์—์„œ ๋ชจ๋ธ์˜ ์„ค๊ณ„๋ฅผ ์ •์˜ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. Caffe ๊ณ„์ธต๋“ค๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” caffe.proto์† ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•˜์—ฌ protocol buffer definitions(prototxt)์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

1. ๋ฐ์ดํ„ฐ ๊ณ„์ธต (Data Layer)

๋ฐ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ ๊ณ„ํ‹์„ ํ†ตํ•˜์—ฌ Caffe๋กœ ๋“ค์–ด๊ฐ„๋‹ค: ์ด๋“ค์€ ๋ง์˜ ์ตœํ•˜์œ„์— ๋†“์—ฌ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค(LevelDB ํ˜น์€ LMDB)์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋ฉฐ, ํ˜น์€ ํšจ์œจ์„ฑ์ด ๋ณ„๋กœ ์ค‘๋Œ€ํ•œ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ๋ฉด, HDF5๋‚ด์˜ ๋””์Šคํฌ ์ƒ ํŒŒ์ผ์ด๋‚˜ ์ผ๋ฐ˜ ์ด๋ฏธ์ง€ ํ˜•ํƒœ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•œ๋‹ค.

์ผ๋ฐ˜ ์ž…๋ ฅ ์ฒ˜๋ฆฌ(ํ‰๊ท ์—ฐ์‚ฐ, ์Šค์ผ€์ผ๋ง, ๋ฌด์ž‘์œ„ ํฌ๋กญํ•‘, ๋ฏธ๋Ÿฌ๋ง)์€ ๊ณ„์ธต๋“ค์ค‘ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ•ด TransformationParameters๋ฅผ ๋ช…์‹œํ•ด์คŒ์œผ๋กœ์จ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํŽธ์ค‘์น˜, ์Šค์ผ€์ผ, ๊ทธ๋ฆฌ๊ณ  ํฌ๋กญ ๋ ˆ์ด์–ด๋Š” TransformationParameter๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ž…๋ ฅ์„ ๋ณ€ํ˜•ํ•˜๋Š”๋ฐ์žˆ์–ด ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋‹ค.

  • ๊ณ„์ธต:

  • ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ(Image Data) - ์ •์ œ๋˜์ง€ ์•Š์€ ๋‚  ๊ฒƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database) - (LEVELDB ํ˜น์€ LMDB)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ์ฝ๋Š”๋‹ค.

  • HDF5์ž…๋ ฅ(HDF5 Input) - read HDF5๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ž„์‹œ ์ฐจ์›์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.

  • HDF5 ์ถœ๋ ฅ(HDF5 Output) - HDF5ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.

  • ์ž…๋ ฅ(Input) - ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์ง„ ๋„คํŠธ์›Œ๋“ค์— ๋Œ€ํ•˜์—ฌ ์ „ํ˜•์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๋˜์–ด์ง„๋‹ค.

  • ์œˆ๋„์šฐ ๋ฐ์ดํ„ฐ(Window Data) - ์œˆ๋„์šฐ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฝ์–ด์˜จ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ(Memory Data) - ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

  • ์“ฐ๋ž˜๊ธฐ ๋ฐ์ดํ„ฐ(Dummy Data) - ์ •์  ๋ฐ์ดํ„ฐ๋‚˜ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๊ฒƒ.

ํŒŒ์ด์ฌ ๊ณ„์ธต์€ ์‚ฌ์šฉ์ž์ •์˜ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ํšจ๊ณผ์ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

#------------------------- W I P ------------------------ #------------------------- W I P ------------------------ #------------------------- W I P ------------------------ #------------------------- W I P ------------------------ #------------------------- W I P ------------------------

2. ์‹œ๊ฐ ๊ณ„์ธต (Vision Layers)

  • Header : ./include/caffe/vision_layers.hpp

์‹œ๊ฐ ๊ณ„์ธต๋“ค์€ ๋ณดํ†ต ์ž…๋ ฅ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„๋“ค์—ฌ์„œ ์ถœ๋ ฅ์œผ๋กœ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์‚ฐํ•œ๋‹ค. ํ˜„์‹ค์„ธ๊ณ„์—์„œ ์ „ํ˜•์ ์ธ "์ด๋ฏธ์ง€"๋Š” ์•„๋งˆ ํ‘๋ฐฑ ์ด๋ฏธ์ง€๋กœ์จ ๋‹จ์ผ ์ƒ‰ ์ฑ„๋„ (c=1) ์ด๋‚˜, RGB (red, green, blue) ์ด๋ฏธ์ง€๋กœ์จ ์„ธ๊ฐœ์˜ ์ƒ‰ ์ฑ„๋„ (c = 3)์„ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ธ€ ๋งฅ๋ฝ์—์„œ, ์ด๋ฏธ์ง€์˜ ํŠน์„ฑ์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ์ง€์˜ ๊ณต๊ฐ„์  ๊ตฌ์กฐ์ด๋‹ค. : ๋ณดํ†ต ์ด๋ฏธ์ง€๋Š” ์•ฝ๊ฐ„์˜ ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ๋†’์ด h>1 ๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋น„ w>1๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด๋Ÿฌํ•œ 2D ๊ธฐํ•˜ํ•™ ๊ตฌ์กฐ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทธ์ž์ฒด๋ฅผ ์ž…๋ ฅ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ํ™•์‹คํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ๋‹ค. ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ ๊ณ„์ธต๋“ค์€ ์ถœ๋ ฅ์˜ ์ง€์—ญ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅ์˜ ๋ช‡๋ช‡ ์ง€์—ญ์— ํŠน์ •ํ•œ ์ž‘์šฉ์„ ์ ์šฉ์‹œํ‚ด์— ์˜ํ•ด ํ™œ๋™ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ, ๋‹ค๋ฅธ ๊ณ„์ธต๋“ค์€ (๋ช‡๋ช‡์˜ ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•ด) ์ž…๋ ฅ์˜ ๊ณต๊ฐ„์  ๊ตฌ์กฐ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค. ์ด๋Š” ํšจ์œจ์ ์œผ๋กœ chw ์ฐจ์›์— "ํ•˜๋‚˜์˜ ํฐ ๋ฒกํ„ฐ" ๋กœ์จ ๊ทธ๊ฒƒ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Convolution

  • Layer type: Convolution
  • CPU implementation: ./src/caffe/layers/convolution_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/convolution_layer.cu
  • Parameters (ConvolutionParameter convolution_param)
  • ์š”๊ตฌ์‚ฌํ•ญ.
  • num_output (c_o): the number of filters
  • kernel_size (or kernel_h and kernel_w): ๊ฐ ํ•„ํ„ฐ์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  • ๊ฐ•๋ ฅํ•œ ๊ถŒ๊ณ ์‚ฌํ•ญ.
  • weight_filler [default type: 'constant' value: 0]
  • ์ถ”๊ฐ€ ์˜ต์…˜.
  1. bias_term [default true]: ํ•„ํ„ฐ ์ถœ๋ ฅ์— ์ถ”๊ฐ€์ ์ธ ํŽธํ–ฅ์˜ ์ง‘๋‹จ์„ ์ ์šฉํ•  ๊ฒƒ์ธ์ง€ ํ•™์Šต์‹œํ‚ฌ ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•œ๋‹ค.
  2. pad (or pad_h and pad_w) [default 0]: (์•”๋ฌต์ ์œผ๋กœ) ์ž…๋ ฅ์˜ ๊ฐ๊ฐ ์‚ฌ์ด๋“œ์— ์ถ”๊ฐ€ํ•  ํ”ฝ์…€์˜ ์ˆ˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  3. stride (or stride_h and stride_w) [default 1]: ์ถœ๋ ฅ์— ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ๊ฐ„๊ฒฉ๋“ค ์œ„์น˜์„ ๋ช…์‹œํ•œ๋‹ค
  4. group (g) [default 1]: ๋งŒ์•ฝ g>1 ๋ฉด, ์ž…๋ ฅ์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ์— ๊ฐ๊ฐ ํ•„ํ„ฐ์˜ ์—ฐ๊ฒฐ์„ ์ œํ•œํ•œ๋‹ค. ํŠนํžˆ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์ฑ„๋„์ด g ๊ทธ๋ฃน๋“ค๋กœ ๋‚˜๋ˆ„์–ด์ง€๊ณ , i๋ฒˆ์งธ ์ถœ๋ ฅ ๊ทธ๋ฃน ์ฑ„๋„์€ ์˜ค์ง i๋ฒˆ์งธ ์ž…๋ ฅ ๊ทธ๋ฃน ์ฑ„๋„๊ณผ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋‹ค.
  • Input
  • n * c_i * h_i * w_i
  • Output
  • n * c_o * h_o * w_o, where h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1 and w_o likewise.
  • Sample (as seen in ./models/bvlc_reference_caffenet/train_val.prototxt)
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  # learning rate and decay multipliers for the filters
  param { lr_mult: 1 decay_mult: 1 }
  # learning rate and decay multipliers for the biases
  param { lr_mult: 2 decay_mult: 0 }
  convolution_param {
    num_output: 96     # learn 96 filters
    kernel_size: 11    # each filter is 11x11
    stride: 4          # step 4 pixels between each filter application
    weight_filler {
      type: "gaussian" # initialize the filters from a Gaussian
      std: 0.01        # distribution with stdev 0.01 (default mean: 0)
    }
    bias_filler {
      type: "constant" # initialize the biases to zero (0)
      value: 0
    }
  }
}

์ปจ๋ณผ๋ฃจ์…˜ ๊ณ„์ธต์€ ์ถœ๋ ฅ์ด๋ฏธ์ง€์—์„œ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ํŠน์ง• ๋งต์„ ์ƒ์‚ฐํ•˜๋ฉด์„œ ๋ฐฐ์šธ์ˆ˜ ์žˆ๋Š” ํ•„ํ„ฐ๋“ค์˜ ์ง‘๋‹จ์œผ๋กœ ์ž…๋ ฅ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ์•„๋†“๋Š”๋‹ค.

Pooling

  • Layer type: Pooling
  • CPU implementation: ./src/caffe/layers/pooling_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/pooling_layer.cu
  • Parameters (PoolingParameter pooling_param)
  • ์š”๊ตฌ ์‚ฌํ•ญ
  • kernel_size (or kernel_h and kernel_w): ๊ฐ๊ฐ์˜ ํ•„ํ„ฐ์˜ ๋†’์ด์™€ ๋„ˆ๋น„๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  • ์ถ”๊ฐ€ ์‚ฌํ•ญ
  • pool [default MAX]: pooling ๋ฉ”์†Œ๋“œ. ํ˜„์žฌ์˜ MAX, AVE๋‚˜ STOHASTIC ๋ช…์‹œ
  • pad (or pad_h and pad_w) [default 0]: (์•”๋ฌต์ ์œผ๋กœ) ์ž…๋ ฅ์˜ ๊ฐ ์‚ฌ์ด๋“œ์— ์ถ”๊ฐ€ํ•  ํ”ฝ์…€์ˆ˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  • stride (or stride_h and stride_w) [default 1]: ์ž…๋ ฅ์— ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•  ๊ฐ„๊ฒฉ์„ ๋ช…์‹œํ•œ๋‹ค.
  • Input
  • n * c * h_i * w_i
  • Output
  • n * c * h_o * w_o, where h_o and w_o are computed in the same way as convolution.
  • Sample (as seen in ./models/bvlc_reference_caffenet/train_val.prototxt)
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 3 # pool over a 3x3 region
    stride: 2      # step two pixels (in the bottom blob) between pooling regions
  }
}

Local Response Normalization (LRN)

  • Layer type: LRN
  • CPU Implementation: ./src/caffe/layers/lrn_layer.cpp
  • CUDA GPU Implementation: ./src/caffe/layers/lrn_layer.cu
  • Parameters (LRNParameter lrn_param)
  • ์ถ”๊ฐ€ ์‚ฌํ•ญ
  • local_size [default 5]: (LRN ์ฑ„๋„์•ˆ์— ๋Œ€ํ•˜์—ฌ) ๋ชจ๋‘ ๋”ํ•  ์‚ฌ๊ฐํ˜• ์ง€์—ญ์˜ ์‚ฌ์ด๋“œ ๊ธธ์ด๋‚˜ (cross channel LRN์— ๋Œ€ํ•˜์—ฌ) ๋ชจ๋‘ ๋”ํ•  ์ฑ„๋„์˜ ์ˆ˜
  • alpha [default 1]: ํŒŒ๋ผ๋ฏธํ„ฐ ํฌ๊ธฐ ์„ค์ • (์•„๋ž˜ ์ฐธ๊ณ )
  • beta [default 5]: ์ง€์ˆ˜ (์•„๋ž˜ ์ฐธ๊ณ )
  • norm_region [default ACROSS_CHANNELS]: (WITHIN_CHANNEL) ๊ณต๊ฐ„์  ์œ„์น˜ ๊ทผ์ฒ˜์™€ (ACROSS_CHANNELS) ์ธ์ ‘ํ•œ ์ฑ„๋„์ค‘ ์–ด๋–ค ๊ฒƒ์„ ๋ชจ๋‘ ๋”ํ• ์ง€

๊ณต๊ฐ„ ๋ฐ˜์‘ ํ‘œ์ค€ํ™” ๊ณ„์ธต์€ ๋กœ์ปฌ ์ž…๋ ฅ ์ง€์—ญ ์ „์ฒด๋ฅผ ํ‘œ์ค€ํ™” ํ•จ์— ์˜ํ•ด "์ธก๋ฉด ์–ต์ œ"์˜ ํ•œ ์ข…๋ฅ˜๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ACROSS_CHANNELS ๋ชจ๋“œ์—์„œ, ๋กœ์ปฌ ์ง€์—ญ์€ ๊ทผ์ฒ˜ ์ฑ„๋„๋“ค์„ ๋„˜์–ด ํ™•์žฅ๋˜์ง€๋งŒ, ๊ณต๊ฐ„์  ํ™•์žฅ์€ ์—†๋‹ค. (์˜ˆ๋ฅผ๋“ค๋ฉด local_size x 1 x 1 ๊ฐ™์ด ๋ชจ์–‘์„ ๊ฐ€์งˆ๋ฟ์ด๋‹ค.) WITHIN_CHANNEL์—์„œ๋Š”, ๋กœ์ปฌ ์ง€์—ญ์ด ๊ณต๊ฐ„์ ์œผ๋กœ ํ™•์žฅ๋˜์ง€๋งŒ, ๋ถ„๋ฆฌ๋œ ์ฑ„๋„๋“ค์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ๋ชปํ•œ๋‹ค. (์˜ˆ๋ฅผ๋“ค์–ด ๊ทธ๋“ค์€ 1 x local_size x local_size์™€ ๊ฐ™์€ ๋ชจ์–‘์„ ๊ฐ€์งˆ ๋ฟ์ด๋‹ค.) ๊ฐ๊ฐ์˜ ์ž…๋ ฅ๊ฐ’์€ (1+(ฮฑ/n)โˆ‘ix2i)ฮฒ์— ์˜ํ•ด ๋‚˜๋ˆ„์–ด ์ง€๋ฉฐ, ์—ฌ๊ธฐ์„œ n์€ ๊ฐ๊ฐ ๋กœ์ปฌ ์ง€์—ญ์˜ ํฌ๊ธฐ์ด๋ฉฐ, ํ•ฉ์€ ๊ทธ ๊ฐ’์œผ๋กœ ์ค‘์‹ฌ์ด ๋œ ์ง€์—ญ์— ์˜ํ•ด ์ ์œ ๋œ๋‹ค. (zero padding์ด ํ•„์š”ํ•œ ๊ณณ์— ์ถ”๊ฐ€๋œ๋‹ค.)

im2col

Im2col์ด๋ž€ ์•„๋งˆ ์ž์„ธํžˆ ์•Œ์•„์•ผ ํ•  ํ•„์š”๊ฐ€ ํ•„์š”๊ฐ€ ์—†๋Š” ์ด๋ฏธ์ง€์—์„œ ์—ด๋กœ (image to column) ์ „ํ™˜์„ ์กฐ๋ ฅ์ž์ด๋‹ค. ํ–‰๋ ฌ ์†์— ๋ชจ๋“  ํŒจ์น˜๋ฅผ ํŽผ์นจ์œผ๋กœ์จ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ํ•˜๋Š” Caffe์˜ ์›์กฐ ์ปจ๋ณผ๋ฃจ์…˜์—์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

3. ์†์‹ค ๊ณ„์ธต (Loss Layers)

์†์‹ค์€ ์ตœ์†Œํ™”ํ•ด์•ผํ•˜๋Š” ๋น„์šฉ์„ ๋“ฑ๋กํ•จ๊ณผ ๋ชฉ๋ฃŒ๋กœ ์‚ผ์•„์•ผํ•˜๋Š” ์ถœ๋ ฅ์„ ๋น„๊ตํ•จ์—์˜ํ•ด ์†์‹ค์„ ํ•™์Šต์œผ๋กœ ๋Œ€๋ ค๊ฐ„๋‹ค. ์†์‹ค ๊ทธ์ž์ฒด๋Š” ์ •๋ฐฉํ–ฅ๊ณผ์ •์— ์˜ํ•ด ๊ณ„์‚ฐ๋˜์–ด ์ง€๊ณ  ์†์‹ค์—์„œ์˜ ๊ทธ๋ž˜๋””์–ธํŠธ w.r.t.๋Š” ์—ญ๋ฐฉํ–ฅ๊ณผ์ •์— ์˜ํ•ด ๊ณ„์‚ฐ๋˜์–ด์ง„๋‹ค.

์†Œํ”„ํŠธ๋งฅ์Šค (Softmax)

  • Layer type: SoftmaxWithLoss

์†Œํ”„ํŠธ๋งฅ์Šค ์†์‹ค ๊ณ„์ธต์€ ๊ณ„์ธต์˜ ์ž…๋ ฅ์˜ ์†Œํ”„ํŠธ๋งฅ์Šค์˜ ๋‹คํ•ญ์‹์˜ ๋กœ์ง€์Šคํ‹ฑ ์†์‹ค(multinomial logistic loss)์„ ์—ฐ์‚ฐํ•œ๋‹ค. ๋‹คํ•ญ์‹ ๋กœ์ง€์Šคํ‹ฑ ์†์‹ค ๊ณ„์ธต์— ์˜ํ•ด ๋‚˜ํƒ€๋‚˜๋Š” ์†Œํ”„ํŠธ๋งฅ์Šค ๊ณ„์ธต์„ ๊ฐœ๋…์ ์œผ๋กœ๋Š” ๋™์ผํ•˜๋‚˜, ๋” ๊ณ„์ˆ˜์ ์ด๋กœ ์•ˆ์ •๋œ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์ œ๊ณฑํ•ฉ / ์œ ํด๋ฆฌ๋””์–ธ (Sum-of-Squares / Euclidean)

  • Layer type: EuclideanLoss

์œ ํด๋ฆฌ๋””์•ˆ ์†์‹ค ๊ณ„์ธต์€ ๋‘ ๊ฐœ์˜ ์„œ๋กœ๋‹ค๋ฅธ ์ž…๋ ฅ์˜ ์ œ๊ณฑ ํ•ฉ์„ ์—ฐ์‚ฐํ•œ๋‹ค.

\frac 1 {2N} \sum_{i=1}^N \| x^1_i - x^2_i \|_2^2

ํžŒ์ง€์™€ ๋งˆ์ง„ (Hinge / Margin)

  • Layer type: HingeLoss
  • CPU implementation: ./src/caffe/layers/hinge_loss_layer.cpp
  • CUDA GPU implementation: none yet
  • Parameters (HingeLossParameter hinge_loss_param)
  • Optional
  • norm [default L1]: the norm used. Currently L1, L2
  • Inputs
  • n * c * h * w Predictions
  • n * 1 * 1 * 1 Labels
  • Output
  • 1 * 1 * 1 * 1 Computed Loss
  • Samples
# L1 Norm
layer {
  name: "loss"
  type: "HingeLoss"
  bottom: "pred"
  bottom: "label"
}

# L2 Norm
layer {
  name: "loss"
  type: "HingeLoss"
  bottom: "pred"
  bottom: "label"
  top: "loss"
  hinge_loss_param {
    norm: L2
  }
}

ํžŒ์ง€ ์†์‹ค ๊ณ„์ธต์€ ์ œ๊ณฑ๋œ ํžŒ์ง€ ์†์‹ค์ด๋‚˜ ๋ชจ๋“  ํžŒ์ง€์— ๋Œ€ํ•ญํ•˜๋Š” ํ•˜๋‚˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

์‹œ๊ทธ๋ชจ์ด๋“œ ํฌ๋กœ์Šค-์—”ํŠธ๋กœํ”ผ (Sigmoid Cross-Entropy)

  • SigmoidCrossEntropyLoss

์ •๋ณด์Šต๋“ (Infogain)

  • InfogainLoss

์ •ํ™•๋„์™€ K ์ตœ์ƒ์œ„(Accuracy and Top-k)

์ •ํ™•๋„๋Š” ๋ชฉํ‘œ์— ๋Œ€ํ•˜์—ฌ ์ถœ๋ ฅ์˜ ์ •ํ™•๋„๋กœ์จ ์ ์ˆ˜๋ฅผ ๋‚ธ๋‹ค. - ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์†์‹ค์ด ์•„๋‹ˆ๋ผ ์—ญ๋ฐฉํ–ฅ๊ณผ์ •์ด ์—†๋Š” ๊ฒƒ์ด๋‹ค.

4. ํ™œ์„ฑํ™” / ๋‰ด๋Ÿฐ ๊ณ„์ธต (Activation / Neuron Layers)

์ผ๋ฐ˜์ ์œผ๋กœ ํ™œ์„ฑํ™” / ๋‰ด๋Ÿฐ ๊ณ„์ธต์€ ํ•˜๋‚˜์˜ bottom blob๋ฅผ ์ทจํ•ด์„œ ๊ฐ™์€ ์‚ฌ์ด์ฆˆ์˜ ํ•˜๋‚˜์˜ top blob๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์›์†Œ์— ๊ด€ํ•œ ์ž‘๋™๊ธฐ์ด๋‹ค. ์•„๋ž˜์˜ ๊ณ„์ธต๋“ค์—์„œ, ์šฐ๋ฆฌ๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‹œํ•  ๊ฒƒ์ด๋‹ค.

  • Input
  • n * c * h * w
  • Output
  • n * c * h * w

ReLU / ์ •๋ฅ˜๋œ-์„ ํ˜• ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋Š”-ReLU (ReLU / Rectified-Linear and Leaky-ReLU)

  • Layer type: ReLU
  • CPU implementation: ./src/caffe/layers/relu_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/relu_layer.cu
  • Parameters (ReLUParameter relu_param)
  • ์ถ”๊ฐ€ ์˜ต์…˜
  • negative_slope [default 0]: ๋„ค๊ฑฐํ‹ฐ๋ธŒ ๋ถ€๋ถ„์„ 0์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ธฐ์šธ๊ธฐ ๊ฐ’์œผ๋กœ ๊ณฑ์…ˆํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ˆ„์ถœ ์‹œํ‚ฌ์ง€ ์•„๋‹์ง€๋ฅผ ๋ช…์‹œํ•œ๋‹ค.
  • Sample (as seen in ./models/bvlc_reference_caffenet/train_val.prototxt)
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}

์ž…๋ ฅ๊ฐ’ x๋ฅผ ๊ณ ๋ คํ•˜์—ฌ, ReLU ๊ณ„์ธต์€ ๋งŒ์•ฝ x > 0์ด๋ฉด ์ถœ๋ ฅ์œผ๋กœ x๋ฅผ ๊ทธ๋ฆฌ๊ณ  x <= 0 ์ด๋ฉด negative_slope * x๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. ๋„ค๊ฑฐํ‹ฐ๋ธŒ ๊ธฐ์šธ๊ธฐ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์„ค์ •๋˜์–ด์žˆ์ง€ ์•Š์„ ๋•Œ, max(x, 0)์„ ์ทจํ•˜๋Š” ๊ฒƒ์˜ ํ‘œ์ค€ ReLU ํ•จ์ˆ˜์™€ ๋™๋“ฑํ•œ๋‹ค. ๋˜ํ•œ bottom ๊ณผ top blob๊ฐ€ ๋ณด์กด ๋งค๋ชจ๋ฆฌ ์žฅ์น˜ ์†Œ๋น„์™€ ๊ฐ™๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ์ œ์ž๋ฆฌ ์—ฐ์‚ฐ (In-place Computation)์„ ์ง€์›ํ•œ๋‹ค.

์‹œ๊ทธ๋ชจ์ด๋“œ (Sigmoid)

  • Layer type: Sigmoid
  • CPU implementation: ./src/caffe/layers/sigmoid_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/sigmoid_layer.cu
  • Sample (as seen in ./examples/mnist/mnist_autoencoder.prototxt)
layer {
  name: "encode1neuron"
  bottom: "encode1"
  top: "encode1neuron"
  type: "Sigmoid"
}

์‹œ๊ทธ๋ชจ์ด๋“œ ๊ณ„์ธต์€ ๊ฐ ์ž…๋ ฅ ์›์†Œ x์— ๋Œ€ํ•˜์—ฌ sigmoid(x)๋กœ ์ถœ๋ ฅ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

ํ•˜์ดํผ๋ธ”๋ฆญ ํƒ„์  ํŠธ (TanH / Hyperbolic Tangent)

  • Layer type: TanH
  • CPU implementation: ./src/caffe/layers/tanh_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/tanh_layer.cu
  • Sample
layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "TanH"
}

ํ•˜์ดํผ๋ธ”๋ฆญ ํƒ„์  ํŠธ (TanH) ๊ณ„์ธต์€ ๊ฐ ์ž…๋ ฅ ์›์†Œ x์— ๋Œ€ํ•˜์—ฌ tanh(x)๋กœ์„œ ์ถœ๋ ฅ์„ ์—ฐ์‚ฐํ•œ๋‹ค.

์ ˆ๋Œ“๊ฐ’ (Absolute Value)

  • Layer type: AbsVal
  • CPU implementation: ./src/caffe/layers/absval_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/absval_layer.cu
  • Sample
layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "AbsVal"
}

AbsVal ๊ณ„์ธต์€ ๊ฐ ์ž…๋ ฅ ์›์†Œ x์— ๋Œ€ํ•˜์—ฌ abs(x)๋กœ์„œ ์ถœ๋ ฅ์€ ์—ฐ์‚ฐํ•œ๋‹ค.

ํŒŒ์›Œ (Power)

  • Layer type: Power
  • CPU implementation: ./src/caffe/layers/power_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/power_layer.cu
  • Parameters (PowerParameter power_param)
  • ์ถ”๊ฐ€ ์˜ต์…˜
  • power [default 1]
  • scale [default 1]
  • shift [default 0]
  • Sample
layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: "Power"
  power_param {
    power: 1
    scale: 1
    shift: 0
  }
}

ํŒŒ์›Œ ๊ณ„์ธต์€ ๊ฐ ์ž…๋ ฅ ์›์†Œ x์— ๋Œ€ํ•˜์—ฌ (shift + scale * x) ^ power ๋กœ์„œ ์ถœ๋ ฅ์„ ์—ฐ์‚ฐํ•œ๋‹ค.

์ด์ง„ ์ผ๋ฐ˜ ๋กœ๊ทธ ์œ ์‚ฌ์„ฑ (BNLL)

  • Layer type: BNLL
  • CPU implementation: ./src/caffe/layers/bnll_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/bnll_layer.cu
  • Sample
layer {
  name: "layer"
  bottom: "in"
  top: "out"
  type: BNLL
}

BNLL (binomial normal log likelihood) ๊ณ„์ธต์€ ๊ฐ ์ž…๋ ฅ ์›์†Œ x์— ๋Œ€ํ•˜์—ฌ log(1 + exp(x))๋กœ์„œ ์ถœ๋ ฅ์€ ์—ฐ์‚ฐํ•œ๋‹ค.

In-Memory

  • Layer type: MemoryData
  • Parameters
  • ์š”๊ตฌ ์‚ฌํ•ญ
  • batch_size, channels, height, width: ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ถ€ํ„ฐ ์ฝ์–ด์˜ค๋Š” ์ž…๋ ฅ ๋Ÿ‰์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์€ ๋ณต์‚ฌ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด (C++ ๊ธฐ๋ฐ˜) "MemoryDataLayer::Reset"์ด๋‚˜ (Python ๊ธฐ๋ฐ˜)"Net.set_input_arrays"๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ๋งŒ ํ•œ๋‹ค. (4D ํ–‰ ์šฐ์„  ๋ฐฐ์—ด๋กœ์จ) ์—ฐ์†์  ๋ฐ์ดํ„ฐ์˜ ์†Œ์Šค๋ฅผ ๋ช…์‹œํ•˜๊ธฐ์œ„ํ•จ์ด๋ฉฐ ์ด๋Š” ํ•œ๋ฒˆ์— ์ผํšŒ ์ฒ˜๋ฆฌ๋Ÿ‰ ํฌ๊ธฐ์˜ ๋ฉ์–ด๋ฆฌ๋ฅผ ์ฝ๋Š”๋‹ค.

5. ์ผ๋ฐ˜ ๊ณ„์ธต (Common Layers)

๋‚ด๋ถ€ ์ƒ์‚ฐ (Inner Product)

  • ayer type: InnerProduct
  • CPU implementation: ./src/caffe/layers/inner_product_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/inner_product_layer.cu
  • Parameters (InnerProductParameter inner_product_param)
  • ์š”๊ตฌ ์‚ฌํ•ญ
  • num_output (c_o): ํ•„ํ„ฐ์˜ ์ˆ˜
  • ๊ฐ•๋ ฅํ•œ ๊ถŒ๊ณ ์‚ฌํ•ญ
  • weight_filler [default type: 'constant' value: 0]
  • ์ถ”๊ฐ€ ์˜ต์…˜
  • bias_filler [default type: 'constant' value: 0]
  • bias_term [default true]: ํ•„ํ„ฐ ์ถœ๋ ฅ์— ์ถ”๊ฐ€์  ํŽธํ–ฅ์˜ ์„ธํŠธ๋ฅผ ์ ์šฉํ•˜๊ณ  ํ•™์Šตํ• ์ง€ ๋ช…์‹œํ•œ๋‹ค.
  • Input
  • n * c_i * h_i * w_i
  • Output
  • n * c_o * 1 * 1
  • Sample
layer {
  name: "fc8"
  type: "InnerProduct"
  # ๊ฐ€์ค‘์น˜์—๋Œ€ํ•œ ํ•™์Šต์œจ๊ณผ ๊ฐ์†Œ ์ œ๊ณฑ
  param { lr_mult: 1 decay_mult: 1 }
  # ํŽธํ–ฅ์น˜์— ๋Œ€ํ•œ ํ•™์Šต์œจ๊ณผ ๊ฐ์†Œ ์ œ๊ณฑ
  param { lr_mult: 2 decay_mult: 0 }
  inner_product_param {
    num_output: 1000
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
  bottom: "fc7"
  top: "fc8"
}

"InnerProduct" ๊ณ„์ธต์€ (์™„์ „ ์—ฐ๊ฒฐ ๊ณ„์ธต์œผ๋กœ์จ ๋ณดํ†ต ์–ธ๊ธ‰๋จ) ์ƒ˜ํ”Œ ๋ฒกํ„ฐ๋กœ์จ ์ž…๋ ฅ์„ ๋‹ค๋ฃจ๊ณ  (1๋กœ blob์˜ ๋†’์ด์™€ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•˜๋ฉด์„œ)๋‹จ์ผ ๋ฒกํ„ฐ์˜ ํ˜•ํƒœ์—์„œ ์ถœ๋ ฅ์„ ์ƒ์‚ฐํ•œ๋‹ค.

๋ถ„์—ด (Splitting)

"Split" ๊ณ„์ธต์€ ๋‹ค์ค‘ ์ถœ๋ ฅ blob์— ์ž…๋ ฅ blob์„ ๋‚˜๋ˆ„๋Š” ๋„๊ตฌ ๊ณ„์ธต์ด๋‹ค. ์ด๋Š” blob๊ฐ€ ๋‹ค์ค‘ ์ถœ๋ ฅ ๊ณ„์ธต์œผ๋กœ ์ ์šฉ๋ฌ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

ํŽธ์œจ, ํƒ€์›์œจ (Flattening)

"Flatten" ๊ณ„์ธต์€ n * (chw)๋ชจ์–‘์˜ ๊ฐ„๋‹จํ•œ ๋ฐฑํ„ฐ ์ถœ๋ ฅ์— n * c * h * w ๋ชจ์–‘์˜ ์ž…๋ ฅ์„ ๋‚ฉ์ž‘ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋„๊ตฌ ๊ณ„์ธต์ด๋‹ค.

์žฌ๊ตฌ์„ฑ (Reshape)

  • Layer type: Reshape
  • Implementation: ./src/caffe/layers/reshape_layer.cpp
  • Parameters (ReshapeParameter reshape_param)
  • ์ถ”๊ฐ€ ์˜ต์…˜: (์•„๋ž˜ ์ž์„ธํ•œ ์„ค๋ช…์„ ์ฐธ๊ณ )
  • shape
  • ์ž…๋ ฅ
  • ์ž„์˜์ ์ธ ์ฐจ์›๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๋‹จ์ผ blob
  • ์ถœ๋ ฅ
  • "reshape_param"๋กœ์จ ๋ช…์‹œ๋œ, ์ˆ˜์ •๋œ ์ฐจ์›๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ™์€ blob reshape_param
  • Sample
  layer {
    name: "reshape"
    type: "Reshape"
    bottom: "input"
    top: "output"
    reshape_param {
      shape {
        dim: 0  # bottom ๊ณ„์ธต์˜ ๊ฐ๊ฐ ์ฐจ์›์„ ๋ณต์‚ฌํ•œ๋‹ค.
        dim: 2
        dim: 3
        dim: -1 # ๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ ๋ถ€ํ„ฐ ์ถ”๋ก ํ•œ๋‹ค.
      }
    }
  }

"Reshape" ๊ณ„์ธต์€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™” ์—†์ด ์ž…์—ญ์˜ ์ฐจ์›์„ ๋ณ€ํ™”์‹œํ‚ค๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํƒ€์›์œจ ๊ณ„์ธต (Flatten layer)์ฒ˜๋Ÿผ, ์ฐจ์›๋งŒ ๋ฐ”๋€๋‹ค. ๊ณผ์ •์ค‘์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๋„ ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ถœ๋ ฅ ์ฐจ์›์€ "ReshapeParam"proto์— ์˜ํ•ด ๋ช…์‹œ๋œ๋‹ค. ์ถœ๋ ฅ blob ์ฐจ์›์— ํ•ด๋‹นํ•˜๊ฒŒ ์„ค์ •ํ•˜๋ฉด์„œ ์–‘์ˆ˜๋Š” ๋ฐ”๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ถ”๊ฐ€๋กœ, ๋‘ ๊ฐœ์˜ ํŠน๋ณ„ํ•œ ๊ฐ’์€ ์–ด๋–ค ๋ชฉํ‘œ ์ฐจ์› ๊ฐ’์— ๋Œ€ํ•˜์—ฌ ๋ฐ›์•„๋“ค์ธ๋‹ค :

  • 0 ์€ "bottom ๊ณ„์ธต์˜ ๊ฐ๊ฐ ์ฐจ์›์„ ๋ณต์‚ฌํ•œ๋‹ค."๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ฒซ ์ฐจ์›์—์„œ bottom์ด 2๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด, ์ฒซ๋ฒˆ์งธ ๋ชฉํ‘œ ์ฐจ์›์œผ๋กœ์จ "dim:0"์„ ์ฃผ๋ฉด์„œ, top ๋˜ํ•œ ์ด์˜ ์ฒซ๋ฒˆ์งธ ๊ณ„์ธต์œผ๋กœ์จ 2๋ฅผ ๊ฐ€์ง„๋‹ค.
  • -1 โ€œ๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ ๋ถ€ํ„ฐ ์ถ”๋ก ํ•œ๋‹ค.โ€๋ฅผ ๋œปํ•œ๋‹ค. ์ด ํ–‰๋™์€ MATLAB์˜ ์žฌ๊ตฌ์„ฑ์— ๋Œ€ํ•˜์—ฌ numpy's๋‚˜ []์—์„œ -1์— ๋Œ€ํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. : ์ด ์ฐจ์›์€ bottom ๊ณ„์ธต์—์„œ์™€ ๊ฐ™์ด ์ „์ฒด ์›์†Œ ์นด์šดํŠธ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ์—์„œ -1์€ ์žฌ๊ตฌ์„ฑ ์ž‘๋™์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ๋กœ์จ "reshape_param { shape { dim: 0 dim: -1 } }"๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์€ ํƒ€์›์œจ ๊ณ„์ธต์—์„œ ์ฒ˜๋Ÿผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ–‰๋™ํ•˜๋Š” ๊ณ„์ธต์„ ์ƒ์„ฑํ•œ๋‹ค.

์—ฐ์† (Concatenation)

  • Layer type: Concat
  • CPU implementation: ./src/caffe/layers/concat_layer.cpp
  • CUDA GPU implementation: ./src/caffe/layers/concat_layer.cu
  • Parameters (ConcatParameter concat_param)
  • ์ถ”๊ฐ€์‚ฌํ•ญ
  • axis [default 1]: 0์€ num์— ๋”ฐ๋ฅธ ์—ฐ์†, 1์€ channel์— ๋”ฐ๋ฅธ ์—ฐ์†.
  • Input
  • n_i * c_i * h * w for each input blob i from 1 to K.
  • Output
  • if axis = 0: (n_1 + n_2 + ... + n_K) * c_1 * h * w, and all input c_i should be the same.
  • if axis = 1: n_1 * (c_1 + c_2 + ... + c_K) * h * w, and all input n_i should be the same.
  • Sample
layer {
  name: "concat"
  bottom: "in1"
  bottom: "in2"
  top: "out"
  type: "Concat"
  concat_param {
    axis: 1
  }
}

"Concat" ๊ณ„์ธต์€ ๋‹จ์ผ ์ถœ๋ ฅ blob์— ๋‹ค์ค‘ ์ž…๋ ฅ blob๋ฅผ ์—ฐ์†์‹œํ‚ค๋Š” ๋„๊ตฌ ๊ณ„์ธต์ด๋‹ค.

์Šฌ๋ผ์ด์‹ฑ (Slicing)

"Slice"๊ณ„์ธต์€ ์ฃผ์–ด์ง„ ์Šฌ๋ผ์ด์Šค ์ง€ํ‘œ์— ๋”ฐ๋ผ์„œ (ํ˜„์žฌ num ์ด๋‚˜ channel ๋งŒ) ์ฃผ์–ด์ง„ ์ฐจ์›์„ ๋”ฐ๋ผ ๋‹ค์ค‘ ์ถœ๋ ฅ ๊ณ„์ธต์— ์ž…๋ ฅ ๊ณ„์ธต์„ ์ฐ์–ด์ฃผ๋Š” ๋„๊ตฌ ๊ณ„์ธต์ด๋‹ค.

  • Sample
layer {
  name: "slicer_label"
  type: "Slice"
  bottom: "label"
  ## Example of label with a shape N x 3 x 1 x 1
  top: "label1"
  top: "label2"
  top: "label3"
  slice_param {
    axis: 1
    slice_point: 1
    slice_point: 2
  }
}

"axis"๋Š” ๋ชฉํ‘œ์ถ•์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ; "slice_point"๋Š” ์„ ํƒ๋œ ์ฐจ์›์—์„œ ์ง€ํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (์ง€ํ‘œ๋“ค์˜ ์ˆ˜๋Š” top blob์˜ ๋งˆ์ด๋„ˆ์Šค 1์˜ ์ˆ˜์™€ ๋™๋“ฑํ•ด์•ผ๋งŒํ•œ๋‹ค.)

Elementwise Operations

Eltwise

Argmax

ArgMax

Softmax

Softmax

Mean-Variance Normalization

MVN