2016-11-08 10 views
1

Предположим, что мы имеем слой, как это:кофейная изменить/повышающую дискретизацию полностью подключен слой

layer { 
    name: "fully-connected" 
    type: "InnerProduct" 
    bottom: "bottom" 
    top: "top" 
    inner_product_param { 
    num_output: 1 
    } 
} 

Выход batch_size х 1. В ряде работ (exmaple link1 страницы 3 фото вверху или link2 страница 4 сверху) Я видел, что они использовали такой слой в конце, чтобы придумать 2D-изображение для пиксельного предсказания. Как можно преобразовать это в двумерное изображение? Я думал о переделке или деконволюции, но я не могу понять, как это будет работать. Простой пример был бы полезным

UPDATE: Мои входные изображения 304x228, а мои ground_truth (изображения глубины) 75x55.

################# Main net ################## 

layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 96 
    kernel_size: 11 
    stride: 4 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "conv1" 
    top: "conv1" 
} 
layer { 
    name: "norm1" 
    type: "LRN" 
    bottom: "conv1" 
    top: "norm1" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "norm1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "pool1" 
    top: "conv2" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 256 
    pad: 2 
    kernel_size: 5 
    group: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.1 
    } 
    } 
} 
layer { 
    name: "relu2" 
    type: "ReLU" 
    bottom: "conv2" 
    top: "conv2" 
} 
layer { 
    name: "norm2" 
    type: "LRN" 
    bottom: "conv2" 
    top: "norm2" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "norm2" 
    top: "pool2" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "conv3" 
    type: "Convolution" 
    bottom: "pool2" 
    top: "conv3" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 384 
    pad: 1 
    kernel_size: 3 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "relu3" 
    type: "ReLU" 
    bottom: "conv3" 
    top: "conv3" 
} 
layer { 
    name: "conv4" 
    type: "Convolution" 
    bottom: "conv3" 
    top: "conv4" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 384 
    pad: 1 
    kernel_size: 3 
    group: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.1 
    } 
    } 
} 
layer { 
    name: "relu4" 
    type: "ReLU" 
    bottom: "conv4" 
    top: "conv4" 
} 
layer { 
    name: "conv5" 
    type: "Convolution" 
    bottom: "conv4" 
    top: "conv5" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 256 
    pad: 1 
    kernel_size: 3 
    group: 2 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.1 
    } 
    } 
} 
layer { 
    name: "relu5" 
    type: "ReLU" 
    bottom: "conv5" 
    top: "conv5" 
} 
layer { 
    name: "pool5" 
    type: "Pooling" 
    bottom: "conv5" 
    top: "pool5" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 
layer { 
    name: "fc6" 
    type: "InnerProduct" 
    bottom: "pool5" 
    top: "fc6" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 4096 
    weight_filler { 
     type: "gaussian" 
     std: 0.005 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.1 
    } 
    } 
} 
layer { 
    name: "relufc6" 
    type: "ReLU" 
    bottom: "fc6" 
    top: "fc6" 
} 
layer { 
    name: "drop6" 
    type: "Dropout" 
    bottom: "fc6" 
    top: "fc6" 
    dropout_param { 
    dropout_ratio: 0.5 
    } 
} 

layer { 
    name: "fc7" 
    type: "InnerProduct" 
    bottom: "fc6" 
    top: "fc7" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    inner_product_param { 
    num_output: 4070 
    weight_filler { 
     type: "gaussian" 
     std: 0.005 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.1 
    } 
    } 
} 

layer { 
    type: "Reshape" 
    name: "reshape" 
    bottom: "fc7" 
    top: "fc7_reshaped" 
    reshape_param { 
    shape { dim: 1 dim: 1 dim: 55 dim: 74 } 
    } 
} 

layer { 
    name: "deconv1" 
    type: "Deconvolution" 
    bottom: "fc7_reshaped" 
    top: "deconv1" 
    convolution_param { 
    num_output: 64 
    kernel_size: 5 
    pad: 2 
    stride: 1 
     #group: 256 
    weight_filler { 
     type: "bilinear" 
    } 
    bias_term: false 
    } 
} 

######################### 

layer { 
    name: "conv6" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv6" 
    param { 
    lr_mult: 1 
    decay_mult: 1 
    } 
    param { 
    lr_mult: 2 
    decay_mult: 0 
    } 
    convolution_param { 
    num_output: 63 
    kernel_size: 9 
    stride: 2 
    pad: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.01 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 
layer { 
    name: "relu6" 
    type: "ReLU" 
    bottom: "conv6" 
    top: "conv6" 
} 

layer { 
    name: "pool6" 
    type: "Pooling" 
    bottom: "conv6" 
    top: "pool6" 
    pooling_param { 
    pool: MAX 
    kernel_size: 3 
    stride: 2 
    } 
} 

######################## 
layer { 
    name: "concat" 
    type: "Concat" 
    bottom: "deconv1" 
    bottom: "pool6" 
    top: "concat" 
    concat_param { 
    concat_dim: 1 
    } 
} 

layer { 
    name: "conv7" 
    type: "Convolution" 
    bottom: "concat" 
    top: "conv7" 
    convolution_param { 
    num_output: 64 
    kernel_size: 5 
    pad: 2 
    stride: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.011 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 

layer { 
    name: "relu7" 
    type: "ReLU" 
    bottom: "conv7" 
    top: "conv7" 
    relu_param{ 
    negative_slope: 0.01 
     engine: CUDNN 
    } 
} 

layer { 
    name: "conv8" 
    type: "Convolution" 
    bottom: "conv7" 
    top: "conv8" 
    convolution_param { 
    num_output: 64 
    kernel_size: 5 
    pad: 2 
    stride: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.011 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 

layer { 
    name: "relu8" 
    type: "ReLU" 
    bottom: "conv8" 
    top: "conv8" 
    relu_param{ 
    negative_slope: 0.01 
     engine: CUDNN 
    } 
} 

layer { 
    name: "conv9" 
    type: "Convolution" 
    bottom: "conv8" 
    top: "conv9" 
    convolution_param { 
    num_output: 1 
    kernel_size: 5 
    pad: 2 
    stride: 1 
    weight_filler { 
     type: "gaussian" 
     std: 0.011 
    } 
    bias_filler { 
     type: "constant" 
     value: 0 
    } 
    } 
} 

layer { 
    name: "relu9" 
    type: "ReLU" 
    bottom: "conv9" 
    top: "result" 
    relu_param{ 
    negative_slope: 0.01 
     engine: CUDNN 
    } 
} 

журнала:

I1108 19:34:57.239722 4277 data_layer.cpp:41] output data size: 1,1,228,304 
I1108 19:34:57.243340 4277 data_layer.cpp:41] output data size: 1,1,55,74 
I1108 19:34:57.247392 4277 net.cpp:150] Setting up conv1 
I1108 19:34:57.247407 4277 net.cpp:157] Top shape: 1 96 55 74 (390720) 
I1108 19:34:57.248191 4277 net.cpp:150] Setting up pool1 
I1108 19:34:57.248196 4277 net.cpp:157] Top shape: 1 96 27 37 (95904) 
I1108 19:34:57.253263 4277 net.cpp:150] Setting up conv2 
I1108 19:34:57.253276 4277 net.cpp:157] Top shape: 1 256 27 37 (255744) 
I1108 19:34:57.254202 4277 net.cpp:150] Setting up pool2 
I1108 19:34:57.254220 4277 net.cpp:157] Top shape: 1 256 13 18 (59904) 
I1108 19:34:57.269943 4277 net.cpp:150] Setting up conv3 
I1108 19:34:57.269961 4277 net.cpp:157] Top shape: 1 384 13 18 (89856) 
I1108 19:34:57.285303 4277 net.cpp:150] Setting up conv4 
I1108 19:34:57.285338 4277 net.cpp:157] Top shape: 1 384 13 18 (89856) 
I1108 19:34:57.294801 4277 net.cpp:150] Setting up conv5 
I1108 19:34:57.294841 4277 net.cpp:157] Top shape: 1 256 13 18 (59904) 
I1108 19:34:57.295207 4277 net.cpp:150] Setting up pool5 
I1108 19:34:57.295210 4277 net.cpp:157] Top shape: 1 256 6 9 (13824) 
I1108 19:34:57.743222 4277 net.cpp:150] Setting up fc6 
I1108 19:34:57.743259 4277 net.cpp:157] Top shape: 1 4096 (4096) 
I1108 19:34:57.881680 4277 net.cpp:150] Setting up fc7 
I1108 19:34:57.881718 4277 net.cpp:157] Top shape: 1 4070 (4070) 

I1108 19:34:57.881826 4277 net.cpp:150] Setting up reshape 
I1108 19:34:57.881846 4277 net.cpp:157] Top shape: 1 1 55 74 (4070) 

I1108 19:34:57.884768 4277 net.cpp:150] Setting up conv6 
I1108 19:34:57.885309 4277 net.cpp:150] Setting up pool6 
I1108 19:34:57.885327 4277 net.cpp:157] Top shape: 1 63 55 74 (256410) 

I1108 19:34:57.885395 4277 net.cpp:150] Setting up concat 
I1108 19:34:57.885412 4277 net.cpp:157] Top shape: 1 64 55 74 (260480) 

I1108 19:34:57.886759 4277 net.cpp:150] Setting up conv7 
I1108 19:34:57.886786 4277 net.cpp:157] Top shape: 1 64 55 74 (260480) 

I1108 19:34:57.897269 4277 net.cpp:150] Setting up conv8 
I1108 19:34:57.897303 4277 net.cpp:157] Top shape: 1 64 55 74 (260480) 
I1108 19:34:57.899129 4277 net.cpp:150] Setting up conv9 
I1108 19:34:57.899138 4277 net.cpp:157] Top shape: 1 1 55 74 (4070) 
+0

процитируйте соответствующие документы. еще лучше, цитируйте параграф, описывающий, что на самом деле вас беспокоит. – Shai

+0

Простите, добавили: – thigi

ответ

2

Значение num_output последнего полностью подключенного уровня не будет 1 для пиксельного предсказания. Он будет равен w*h входного изображения.

Что заставило вас почувствовать, что значение будет 1?

Edit 1:

Ниже приведены размеры каждого слоя, указанного в link1 странице 3 фигуры:

LAYER  OUTPUT DIM [c*h*w] 
course1  96*h1*w1  conv layer 
course2  256*h2*w2 conv layer 
course3  384*h3*w3 conv layer 
course4  384*h4*w4 conv layer 
course5  256*h5*w5 conv layer 
course6  4096*1*1  fc layer 
course7  X*1*1  fc layer where 'X' could be interpreted as w*h 

Чтобы понять это далее, позволяет предположить, что мы имеем сеть предсказывать пиксели изображение. Изображения имеют размер 10 * 10. Таким образом, конечный вывод слоя fc тоже будет иметь размерность 100 * 1 * 1 (как в курсе 7). Это можно интерпретировать как 10 * 10.

Теперь вопрос будет, как 1d-массив может правильно спрогнозировать 2d-изображение. Для этого вы должны отметить, что потери вычисляются для этого вывода, используя метки, которые могут соответствовать данным пикселя. Таким образом, во время обучения весы будут учиться прогнозировать данные пикселей.

EDIT 2:

Попытка нарисовать сетку, используя draw_net.py в CAFFE, дает вам следующее: enter image description here

relu слой связан с conv6 и fc6 имеет то же имя, что приводит к сложным связность в обратном изображении. Я не уверен, приведет ли это к некоторым проблемам во время обучения, но я бы предложил вам переименовать один из слоев relu в уникальное имя, чтобы избежать некоторых непредвиденных проблем.

Возвращаясь к вашему вопросу, похоже, что после полностью подключенных слоев не возникает всплеск. Как видно в журнале:

I1108 19:34:57.881680 4277 net.cpp:150] Setting up fc7 
I1108 19:34:57.881718 4277 net.cpp:157] Top shape: 1 4070 (4070) 

I1108 19:34:57.881826 4277 net.cpp:150] Setting up reshape 
I1108 19:34:57.881846 4277 net.cpp:157] Top shape: 1 1 55 74 (4070) 

I1108 19:34:57.884768 4277 net.cpp:150] Setting up conv6 
I1108 19:34:57.885309 4277 net.cpp:150] Setting up pool6 
I1108 19:34:57.885327 4277 net.cpp:157] Top shape: 1 63 55 74 (256410) 

fc7 имеет выходной размер 4070 * 1 * 1. Он преобразуется в 1 * 55 * 74 для передачи в качестве слоя conv6.

Выход всей сети производится в conv9, который имеет выходной размер 1*55*74, что в точности аналогично размеру меток (данные глубины).

Пожалуйста, укажите, где вы чувствуете, что происходит повышение, если мой ответ все еще не ясен.

+0

вышеупомянутый документ выше! Посмотрите на страницу 3 изображение сети. Но если выход будет 'w * h', как вы получите 2d-образ? – thigi

+0

На рисунке просто указано, что глубина изображения равна 1. Но вы можете видеть, что выход представляет собой изображение 2d, как показано на рисунке. Вы можете получить значения пикселей изображения в полутонах серого, предположив, что первые «w» пиксели соответствуют первой строке и т. Д. –

+0

Посмотрите на редактирование 1 ответа –

-1

, если вам нужно просто полностью подключены сети, как обычного многослойного персептрона, использовать 2D сгустки (shape (N, D)) и вызовите InnerProductLayer.

+0

Можете ли вы привести пример, я не могу следовать вашим мыслям. – thigi

+0

Я постараюсь вам помочь, если вы скажете, чего именно вы хотите. –

+0

Я только что добавил несколько ссылок. Вы можете взглянуть на [link1] (https://arxiv.org/pdf/1406.2283v1.pdff) стр. 3 сверху. Есть изображение, и я хочу скопировать эту сеть в кафе. Тем не менее, они используют полностью подключенные слои в конце, что приводит к разрешению 1x1, а затем они имеют разрешение, подобное слою 74x55 (Coarse 7). Я понимаю все, но этот слой ... – thigi