tutorial learning cafe c++ neural-network deep-learning caffe conv-neural-network

c++ - learning - caffe tutorial



Personalizar la capa de convolución en caffe windows cpp (1)

Tengo esta red ''RGB2GRAY.prototxt'' :

name: "RGB2GRAY" layer { name: "data" type: "Input" top: "data" input_param { shape: { dim: 1 dim: 3 dim: 512 dim: 512 } } } layer { name: "conv1" bottom: "data" top: "conv1" type: "Convolution" convolution_param { num_output: 1 kernel_size: 1 pad: 0 stride: 1 bias_term: false weight_filler { type: "constant" value: 1 } } }

Estoy probando mi propia red que convierte RGB en gris usando esta fórmula

x = 0.299r + 0.587g + 0.114b.

así que, básicamente, puedo hacer convolución con un tamaño de kernel de 1 con pesos personalizados de (0.299, 0.587, 0.114). pero no entiendo cómo modificar la capa de convolución. He establecido los pesos y el sesgo pero no he podido modificar el valor del filtro. He intentado el siguiente enfoque pero no actualiza el filtro de convolución.

shared_ptr<Net<float> > net_; net_.reset(new Net<float>("path of model file", TEST)); const shared_ptr<Blob<float> >& conv_blob = net_->blob_by_name("conv1"); float* conv_weight = conv_blob->mutable_cpu_data(); conv_weight[0] = 0.299; conv_weight[1] = 0.587; conv_weight[2] = 0.114; net_->Forward(); //for dumping the output const shared_ptr<Blob<float> >& probs = net_->blob_by_name("conv1"); const float* probs_out = probs->cpu_data(); cv::Mat matout(height, width, CV_32F); for (size_t i = 0; i < height; i++) { for (size_t j = 0; j < width; j++) { matout.at<float>(i, j) = probs_out[i* width + j]; } } matout.convertTo(matout, CV_8UC1); cv::imwrite("gray.bmp", matout);

En Python, me pareció más fácil personalizar el filtro de convolución, pero necesito la solución en C ++.


Solo en su código c ++ haga un pequeño cambio:

// access the convolution layer by its name const shared_ptr<Layer<float> >& conv_layer = net_->layer_by_name("conv1"); // access the layer''s blob that stores weights shared_ptr<Blob<float> >& weight = conv_layer->blobs()[0]; float* conv_weight = weight->mutable_cpu_data(); conv_weight[0] = 0.299; conv_weight[1] = 0.587; conv_weight[2] = 0.114;

De hecho, " conv1 " se refiere al blob salida de la capa de convolución en tu código, no al blob contiene pesas y la función de Net<Dtype>::blob_by_name(const string& blob_name) es devolver el blob que almacena los resultados intermedios entre las capas dentro de una red