2017-02-09 20 views
1

При просмотре прототипа googlenet обнаруживается, что начальные слои имеют конкатский слой в конце, который принимает несколько нижних входов.Каков размер вывода в googlenet после слоя concat?

например:

layer { 
    name: "inception_3a/output" 
    type: "Concat" 
    bottom: "inception_3a/1x1" 
    bottom: "inception_3a/3x3" 
    bottom: "inception_3a/5x5" 
    bottom: "inception_3a/pool_proj" 
    top: "inception_3a/output" 
} 

Как можно видеть, есть один 1x1 ко-слой, один 3x3 ко-слой, один 5x5 ко-слой и, наконец, слой пулы. Эти слои описаны следующим образом:

layer { 
    name: "inception_3a/1x1" 
    type: "Convolution" 
    bottom: "pool2/3x3_s2" 
    top: "inception_3a/1x1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 64 
    kernel_size: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "inception_3a/relu_1x1" 
    type: "ReLU" 
    bottom: "inception_3a/1x1" 
    top: "inception_3a/1x1" 
} 
layer { 
    name: "inception_3a/3x3_reduce" 
    type: "Convolution" 
    bottom: "pool2/3x3_s2" 
    top: "inception_3a/3x3_reduce" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 96 
    kernel_size: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.09 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "inception_3a/relu_3x3_reduce" 
    type: "ReLU" 
    bottom: "inception_3a/3x3_reduce" 
    top: "inception_3a/3x3_reduce" 
} 
layer { 
    name: "inception_3a/3x3" 
    type: "Convolution" 
    bottom: "inception_3a/3x3_reduce" 
    top: "inception_3a/3x3" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 128 
    pad: 1 
    kernel_size: 3 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "inception_3a/relu_3x3" 
    type: "ReLU" 
    bottom: "inception_3a/3x3" 
    top: "inception_3a/3x3" 
} 
layer { 
    name: "inception_3a/5x5_reduce" 
    type: "Convolution" 
    bottom: "pool2/3x3_s2" 
    top: "inception_3a/5x5_reduce" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 16 
    kernel_size: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.2 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "inception_3a/relu_5x5_reduce" 
    type: "ReLU" 
    bottom: "inception_3a/5x5_reduce" 
    top: "inception_3a/5x5_reduce" 
} 
layer { 
    name: "inception_3a/5x5" 
    type: "Convolution" 
    bottom: "inception_3a/5x5_reduce" 
    top: "inception_3a/5x5" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 32 
    pad: 2 
    kernel_size: 5 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "inception_3a/relu_5x5" 
    type: "ReLU" 
    bottom: "inception_3a/5x5" 
    top: "inception_3a/5x5" 
} 
layer { 
    name: "inception_3a/pool" 
    type: "Pooling" 
    bottom: "pool2/3x3_s2" 
    top: "inception_3a/pool" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 1 
    pad: 1 
    } 
} 
layer { 
    name: "inception_3a/pool_proj" 
    type: "Convolution" 
    bottom: "inception_3a/pool" 
    top: "inception_3a/pool_proj" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 32 
    kernel_size: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.1 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 

Можно видеть, что они имеют разное количество продукции, а также различные размеры фильтра, так или иначе в документации на Concat слоя заключается в следующем:

вход:

n_i * c_i * h * w for each input blob i from 1 to K.

Выход:

если Акси s = 0: (n_1 + n_2 + ... + n_K) * c_1 * h * w, и все входные данные c_i должны быть одинаковыми.

если ось = 1: n_1 * (c_1 + c_2 + ... + c_K) * h * w, и все входные данные n_i должны быть одинаковыми.

Во-первых, я не уверен, что такое по умолчанию, и, во-вторых, я не уверен, какие размеры будут иметь выходной том, так как ширина и высота должны оставаться неизменными, но все уровни conv conv производят разные выходы. Любые указатели действительно были бы оценены

ответ

1

Значение по умолчанию для оси «Конкат» равно 1, таким образом конкатенируя по размеру канала. Для этого все слои, которые объединены, должны иметь одинаковую высоту и ширину. Глядя в журнал, то размеры (предполагается, что размер пакета 32):

inception_3a/1x1 -> [32, 64, 28, 28]
inception_3a/3x3 -> [32, 128, 28, 28]
inception_3a/5x5 -> [32, 32, 28, 28]
inception_3a/pool_proj -> [32, 32, 28, 28]

Таким образом, конечный результат будет иметь размер:
inception_3a/выход -> [32 (64 + 128 + 32 + 32) 28, 28] -> [32, 256, 28, 28]

Как ожидается, из журнала Caffe:

Creating Layer inception_3a/output 
inception_3a/output <- inception_3a/1x1 
inception_3a/output <- inception_3a/3x3 
inception_3a/output <- inception_3a/5x5 
inception_3a/output <- inception_3a/pool_proj 
inception_3a/output -> inception_3a/output 
Setting up inception_3a/output 
Top shape: 32 256 28 28 (6422528) 
+0

если ось будет равна 2 или 3, и поэтому в ней будут следующие размеры? – Kev1n91

+0

Да, но обратите внимание, что в этом случае он не будет работать, поскольку все слои имеют различное количество каналов. На практике все входные оси должны иметь одинаковые размеры, за исключением оси concat, как указано в коде: [concat_layer.cpp] (https://github.com/BVLC/caffe/blob/master/src/caffe/layers /concat_layer.cpp) –