我正在尝试在 c++ 中实现轻量级(最小库依赖性)版本的 TensorFlow 图,并且我正在尝试使用 Eigen Tensor 对象来执行图操作。现在我一直在尝试使用 EigenTensor.convolve()方法来尝试复制 TensorFlow 的 Conv2D 操作的行为。为了简单起见,我最初的 Conv2D 操作没有填充,步幅为 1。
卷积层的输入是一个 51x51x1 张量,它与大小为 3x3x1x16 的滤波器组进行卷积。在张量流中,这会生成大小为 49x49x16 的输出张量。使用下面的特征代码在 C++ 中设置相同的操作仅填充输出张量的第一个通道,因此顶部 49x49x1 单元格包含正确的值,但其余 1-15 个通道不会填充。
Eigen::TensorMap<Eigen::Tensor<float,4> > filter(filter, 3, 3, 1, 16 );
Eigen::TensorMap<Eigen::Tensor<float,3> > input(inputBuffer, 51, 51, 1 );
Eigen::TensorMap<Eigen::Tensor<float,3> > output(outputBuffer, 49, 49, 16);
Eigen::array<ptrdiff_t, 2> convDims({0, 1});
output = input.convolve(filter, convDims);
Run Code Online (Sandbox Code Playgroud)
我认为我错误地理解了这些函数的作用,并且它们没有执行相同的操作。为了让我的实现正常工作,我尝试循环遍历 16 个过滤器通道,并将卷积方法单独应用于每个通道,但我遇到了编译器错误,我无法理解以下代码:
for (int s=0; s<16; ++s)
{
Eigen::array<int, 4> fOffset = {0, 0, 0, s};
Eigen::array<int, 4> fExtent …Run Code Online (Sandbox Code Playgroud)