gpt4 book ai didi

c++ - 3D滤镜方式如何在caffe中实现deconv层?

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:29 25 4
gpt4 key购买 nike

我有一个需求,以3D过滤的方式实现deconv层的正向计算。

在这里,“3D 过滤方式”是指像 CV 中的高斯过滤器那样的卷积。而caffe则以gemm + col2im的方式实现deconv。

我发现了一个类似的问题 here .小伙按照tranposed conv中的介绍写了代码.

Image

他/她没有打开源代码。所以我完成了自己的一个:

template <typename DataType> int deconv_cpu(
DataType *src, DataType *dst, DataType *para, DataType *bias,
int in_width, int in_height, int in_channel,
int out_width, int out_height, int out_channel,
int ks, int padding = 0, int step = 1) { // step indicates the stride

int col, row, ch_o, ch_i, x, y;
int r = (ks - 1) / 2; //radius;

DataType result;
DataType *output;
DataType *filter;
DataType *input;

int sim_width, sim_height, sim_pad, width_border, height_border;
sim_width = in_width * step - step + 1;
sim_height = in_height * step - step + 1;
sim_pad = ks - padding - 1;
width_border = sim_pad == 0 ? r : 0;
height_border = sim_pad == 0 ? r : 0;
for (row = height_border; row < (sim_height - height_border); row++)
for (col = width_border; col < (sim_width - width_border); col++)
{
for (ch_o = 0; ch_o < out_channel; ch_o++)
{
output = dst + ch_o * out_width * out_height;
result = 0;
for (ch_i = 0; ch_i < in_channel; ch_i++)
{
filter = para + ks * ks * (in_channel * ch_o + ch_i);
//filter = para + ks*ks * (out_channel * ch_i + ch_o);
input = src + ch_i * in_width * in_height;
for (x = -r; x <= r; x++)
{
for (y = -r; y <= r; y++)
{
if ((row + x) >= 0 && (col + y) >= 0 && (row + x) < sim_height && (col + y) < sim_width)
{
if ( (row + x) % step != 0 || (col + y) % step != 0) continue;
result += input[(row + x) / step * in_width + (col + y) / step] * filter[(x + r) * ks + (y + r)];
}
}
}
}

if (bias != NULL) result = result + bias[ch_o];
output[(row - height_border) * out_width + (col - width_border)] = result;
}
}
return 0;
}

我将结果与 caffe 的结果进行比较:

const caffe::vector<caffe::shared_ptr<caffe::Blob<float> > > blobs = layers[i]->blobs();
float *filter = blobs[0]->mutable_cpu_data();
float *bias = blobs[1]->mutable_cpu_data();

caffe::shared_ptr<caffe::Blob<float> > blob;
blob = caffe_net->blob_by_name(np.bottom(0));
deconv_cpu(blob->mutable_cpu_data(), dst, filter, bias, width1,
height1, c1, width2, height2, c2, ks, pad, stride);

blob = caffe_net->blob_by_name(np.top(0));
if(compare(dst, blob->mutable_cpu_data()) == 0) printf("match\n");
else printf("do not match\n");

但是,代码并没有给出与 caffe 实现相同的结果。

谁知道哪里出了问题?或者对代码有任何建议或评论?

最佳答案

此问题最终通过更改过滤器索引得到解决:过滤器[(r-x) * ks + (r-y)]

关于c++ - 3D滤镜方式如何在caffe中实现deconv层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45436971/

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