Как использовать Eigen :: Tensor :: convolve с несколькими ядрами? - PullRequest
1 голос
/ 10 ноября 2019

Свертывание входного тензора формы (3, 20, 30) (запись в канале) с 8 фильтрами формы (3, 5, 7) должно привести к получению тензора формы (8, 24, 16). Я пытаюсь реализовать это, используя Eigen::Tensor::convolve, но в результате получается форма (1, 24, 16). Похоже, что вместо всех 8.

применяется только один из фильтров. Вот минимальный пример:

#include <cassert>
#include <iostream>
#include <eigen3/unsupported/Eigen/CXX11/Tensor>

int main() {
    int input_height = 20;
    int input_width = 30;
    int input_channels = 3;

    int kernels_height = 5;
    int kernels_width = 7;
    int kernels_channels = 3;
    int kernel_count = 8;

    assert(kernels_channels == input_channels);

    int expected_output_height = input_height + 1 - kernels_height;
    int expected_output_width = input_width + 1 - kernels_width;
    int expected_output_channels = kernel_count;

    Eigen::Tensor<float, 3> input(input_channels, input_width, input_height);
    Eigen::Tensor<float, 4> filters(kernels_channels, kernels_width, kernels_height, kernel_count);

    Eigen::array<ptrdiff_t, 3> dims({0, 1, 2});
    Eigen::Tensor<float, 3> output = input.convolve(filters, dims);

    const Eigen::Tensor<float, 3>::Dimensions& d = output.dimensions();

    std::cout << "Expected output shape: (" << expected_output_channels << ", " << expected_output_width << ", " << expected_output_height << ")" << std::endl;
    std::cout << "Actual shape: (" << d[0] << ", " << d[1] << ", " << d[2] << ")" << std::endl;
}

И его вывод:

Expected output shape: (8, 24, 16)
Actual shape: (1, 24, 16)

Конечно, можно перебирать фильтры один за другим и вызывать .convolve для каждого , но это

  • приведет к появлению тензора с каналами, не являющимися первымиизмерение
  • может быть не так оптимизировано по производительности, как выполнение всего за один вызов
  • требует больше пользовательского кода

Так что я думаю, что что-то не так в моемиспользование библиотеки Eigen. Как это сделано правильно?

...