Изменение типа Eigen :: Tensor (Карта) - PullRequest
0 голосов
/ 28 января 2019

В настоящее время я создаю пользовательский TensorFlow Op.Он должен работать как Conv2D-Op, за исключением того, что он работает с пользовательским типом данных.Поскольку реализация пользовательского типа данных относительно проста в Eigen и довольно сложна в TensorFlow, я решил скопировать собственный тензор Eigen в новый собственный тензор с моим пользовательским типом данных, прежде чем TensorFlow вызовет Eigen.Преобразовав Eigen::TensorMap<Eigen::Tensor<float, 4, Eigen::RowMajor, Eigen::DenseIndex>, Eigen::Aligned> в Eigen::TensorMap<Eigen::Tensor<CustomType, 4, Eigen::RowMajor, Eigen::DenseIndex>, Eigen::Aligned>, запустите вычисление и затем верните обратно в float s.

Я добавил некоторый код в TensorFlows conv_2d.h, в operator() из SpatialConvolution,Я написал две вспомогательные функции convertToCustomType и convertFromCustomType, которые должны выполнить преобразование для меня.На данный момент меня не особо волнует производительность.

Так что, по сути, я ввожу две свои функции преобразования до и после этой строки: https://github.com/tensorflow/tensorflow/blob/r1.12/tensorflow/core/kernels/conv_2d.h#L72

template<typename T>
Eigen::Tensor<CustomType, 4, Eigen::RowMajor, Eigen::DenseIndex> convertToCustomType(T &input) {
    Eigen::Tensor<CustomType, 4, Eigen::RowMajor, Eigen::DenseIndex> ret;
    ret.resize(input.dimensions());

    for (int a = 0; a < ret.size(); a++) {
        ret(a) = input(a);
    }
    return ret;
}

template<typename T1, typename T2>
void convertFromCustomType(T1 &input, T2 &output) {
    for (int a = 0; a < input.size(); a++) {
        output(a) = input(a);
    }
}

template<typename Device, typename T>
struct SpatialConvolution {
    void operator()(const Device &d, typename TTypes<T, 4>::Tensor output,
                    typename TTypes<T, 4>::ConstTensor input,
                    typename TTypes<T, 4>::ConstTensor filter, int row_stride,
                    int col_stride, int row_dilation, int col_dilation,
                    const Eigen::PaddingType &padding) {


        auto input_c = convertToCustomType(input);
        auto filter_c = convertToCustomType(filter);
        auto output_c = convertToCustomType(output);

        SpatialConvolutionFunc(d, output_c, input_c, filter_c, row_stride, col_stride, row_dilation, col_dilation, padding);

        convertFromCustomType(output_approx, output);
        output.device(d) = output;
    }
};

Я также пытался переехатьвсе 4 измерения тензора по отдельности, которые также не работают.

template <typename T>
Eigen::Tensor<ApproxType, 4, Eigen::RowMajor> convertToCustomType(T input) {
    Eigen::Tensor<ApproxType, 4, Eigen::RowMajor> ret;
    ret.resize(input.dimensions());
    for (int a = 0; a < ret.dimension(0); a++) {
        for (int b = 0; b < ret.dimension(1); b++) {
            for (int c = 0; c < ret.dimension(2); c++) {
                for (int d = 0; d < ret.dimension(3); d++) {
                    ret(a, b, c, d) = input(a, b, c, d);
                }
            }
        }
    }
    return ret;
}

Обе версии компилируются, но дают неверные результаты.Если я запускаю всю свою сеть TensorFlow с этой пользовательской операцией, она становится недетерминированной, выходные данные меняются в разных сериях с одним и тем же входным сигналом.

0
[[-0.06590138]]
1
[[-0.04544453]]
2
[[-0.0286443]]
3
[[-0.06590138]]
4
[[-0.06590138]]
5
[[-0.04544453]]

Как я должен изменить фактический тип собственного Тензорного?Я заметил, что есть что-то элегантное, например Tensor::cast<T>(), но при вызове T, отличном от Eigen::half, не компилируется.Может быть, мне что-то не хватает в моем пользовательском типе?

Я знаю, что это довольно специфическая проблема, но я был бы признателен за любые идеи.

1 Ответ

0 голосов
/ 29 января 2019

Очевидно, что недостаточно создать Тензор, его нужно инициализировать, например, с ret.setZero() перед его заполнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...