gpt4 book ai didi

c++ - 自定义caffe windows cpp中的卷积层

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:01 24 4
gpt4 key购买 nike

我有这个网络 '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
}
}
}

我正在尝试使用此公式将 RGB 转换为灰色的自己的网络

x = 0.299r + 0.587g + 0.114b.

基本上,我可以使用大小为 1 的内核和自定义权重 (0.299, 0.587, 0.114) 进行卷积。但我不知道如何修改卷积层。我已经设置了权重和偏差,但无法修改过滤器值。我尝试了下面的方法,但它无法更新卷积过滤器。

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);

在 python 中,我发现自定义卷积滤波器更容易,但我需要 C++ 中的解决方案。

最佳答案

只需在您的 C++ 代码中做一个小改动:

// 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;

其实“conv1”指的是卷积层的输出blob在你的代码中,而不是 blob包含重量和 Net<Dtype>::blob_by_name(const string& blob_name)的功能是返回blob存储网络各层之间的中间结果。

关于c++ - 自定义caffe windows cpp中的卷积层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41162036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com