2016-12-26 2 views
6

Я новичок в caffe, я пытаюсь нормализовать выход свертки между 0 и 1 с Min-Max Normalization.Минимальный уровень нормализации в Caffe

Out = X - Xmin/(Xmax - Xmin)

Я проверил много слоев (Power, масштаб, Batch Нормализация, МВН), но никто не дает мне мин-макс Нормализация выход в слоях. Может кто-нибудь мне помочь ??

************* мой prototxt *****************

name: "normalizationCheck" 
layer { 
    name: "data" 
    type: "Input" 
    top: "data" 
    input_param { shape: { dim: 1 dim: 1 dim: 512 dim: 512 } } 
} 

layer { 
    name: "normalize1" 
    type: "Power" 
    bottom: "data" 
    top: "normalize1" 
    power_param { 
    shift: 0 
    scale: 0.00392156862 
    power: 1 
    } 
} 

layer { 
    bottom: "normalize1" 
    top: "Output" 
    name: "conv1" 
    type: "Convolution" 
    convolution_param { 
     num_output: 1 
     kernel_size: 1 
     pad: 0 
     stride: 1 
     bias_term: false 
     weight_filler { 
     type: "constant" 
     value: 1 
     } 
    } 
} 

Выходной свертка слой не в Нормализованная форма Я хочу Min-Max Нормализованный вывод в формате Layer. В ручном режиме я могу использовать код, но мне нужно в слоях. Спасибо

+1

если вы можете сделайте это в коде, вы можете написать слой самостоятельно. Но как вы меняете эту операцию? как выглядит backprop? – Shai

+0

@Shai - Я не использую его для обучения, поэтому обратное прохождение не требуется. Я просто хотел получить отфильтрованный вывод. – AnkitSahu

+0

@Shai - как писать слои в коде. Пожалуйста, объясни ? – AnkitSahu

ответ

4

Вы можете написать свой собственный уровень C++, следующий за these guidelines, вы увидите, как реализовать «только вперед» слои на этой странице.

В качестве альтернативы, вы можете реализовать слой питона и выполнить его в CAFFE через '"Python"' layer:

Во-первых, реализовать свой слой в питона, храните его в '/path/to/my_min_max_layer.py':

import caffe 
import numpy as np 

class min_max_forward_layer(caffe.Layer): 
    def setup(self, bottom, top): 
    # make sure only one input and one output 
    assert len(bottom)==1 and len(top)==1, "min_max_layer expects a single input and a single output" 

    def reshape(self, bottom, top): 
    # reshape output to be identical to input 
    top[0].reshape(*bottom[0].data.shape) 

    def forward(self, bottom, top): 
    # YOUR IMPLEMENTATION HERE!! 
    in_ = np.array(bottom[0].data) 
    x_min = in_.min() 
    x_max = in_.max() 
    top[0].data[...] = (in_-x_min)/(x_max-x_min) 

    def backward(self, top, propagate_down, bottom): 
    # backward pass is not implemented! 
    pass 

После того, как у вас есть слой реализован в питона, вы можете просто добавить его к вашей сети (убедитесь, что '/path/to' в вашем $PYTHONPATH):

layer { 
    name: "my_min_max_forward_layer" 
    type: "Python" 
    bottom: "name_your_input_here" 
    top: "name_your_output_here" 
    python_param { 
    module: "my_min_max_layer" # name of python file to be imported 
    layer: "min_max_forward_layer" # name of layer class 
    } 
} 
+1

Ваш метод кажется правильным, но практически я не могу реализовать в окнах cpp, потому что vision_layers.hpp отсутствует в моей рабочей области ... Можете ли вы, пожалуйста, помочь мне с cpp ?? – AnkitSahu

+0

@AnkitSahu вам не нужно 'vision_layers.hpp', это устарело. Следуйте рекомендациям в [этой ссылке] (https://github.com/BVLC/caffe/wiki/Development), и все готово! – Shai

Смежные вопросы