2016-09-13 2 views
4

Кажется достаточно простым. Я бы подумал, что какая-то кастинг станет возможной, но я не могу найти никакой документации для нее.Как изменить 2D Eigen :: Тензор для Eigen :: Matrix

Хотя я нашел способы в своем приложении, чтобы избежать использования класса Eigen :: Matrix, TensorFlow работает только с Eigen :: Tensor, а другая библиотека, которую я использую, имеет только функции для работы непосредственно с Eigen :: Matrix. Это было бы впечатляюще для чтения кода, если бы я мог использовать тензор как матрицу и работать с этим.

Редактировать: кажется, что TensorFlow DOES имеет функцию, чтобы получить Eigen :: Matrix (все еще проверяя ее). Возможно, это делает вопрос оригинальным менее интересным (возможно, никому НЕ НУЖНО преобразовать Тензоры в Матрицы.) Однако я все еще думаю, что это правильный вопрос. поэтому я не стану оставлять

Редактировать 2: после обработки ошибок TF после некоторой ошибки сборки кажется, что функция Tensor :: matrix() функции tensorflow просто возвращает 2d Eigen :: Tensor, поэтому преобразование на самом деле необходимо.

ответ

9

Это обычный вариант использования линейных алгебр TensorFlow, а реализация может быть найдена в tensorflow/core/kernels/linalg_ops_common.cc. Однако этот код сильно templatized, поэтому было бы полезно иметь конкретный пример.

Предполагая, что вы начинаете с tensorflow::Tensor называется t с элементом типа float, вы можете сделать матрицу Эйген m следующим образом:

tensorflow::Tensor t = ...; 

auto m = Eigen::Map<Eigen::Matrix< 
      float,   /* scalar element type */ 
      Eigen::Dynamic, /* num_rows is a run-time value */ 
      Eigen::Dynamic, /* num_cols is a run-time value */ 
      Eigen::RowMajor /* tensorflow::Tensor is always row-major */>>(
       t.flat<float>().data(), /* ptr to data */ 
       t.dim_size(0),   /* num_rows */ 
       t.dim_size(1)   /* num_cols */); 

Если тензор приходит от входа в tensorflow::OpKernel (например, в методе Compute()), вы должны использовать несколько иной тип с соответствующей const квалификации:

OpKernelContext* ctx = ...; 
const tensorflow::Tensor t = ctx->input(...); 

const auto m = Eigen::Map<const Eigen::Matrix< 
        float,   /* scalar element type */ 
        Eigen::Dynamic, /* num_rows is a run-time value */ 
        Eigen::Dynamic, /* num_cols is a run-time value */ 
        Eigen::RowMajor /* tensorflow::Tensor is always row-major */>>(
         t.flat<float>().data(), /* ptr to data */ 
         t.dim_size(0),   /* num_rows */ 
         t.dim_size(1)   /* num_cols */); 
+0

о эй, я видел это право, как я заканчивая мое редактирование. Этот ответ на самом деле имеет больше смысла, чем я. Спасибо за помощь! –

+0

Да, половина битвы распаковывает определения шаблонов :). Рад помочь! – mrry

+2

Кроме того, хотя ваш ответ был полностью верным, общий пример использования Tensorflow для этого, вероятно, будет включать в себя получение тензора через функцию ввода OpKernelContext *, которая возвращает const Tensor. Точно так же, как отображаемая Eigen :: Matrix должна быть const. (Это касается только тех людей, которые меня не очень хорошо знают C++, и я не могу хорошо прочитать ошибки компилятора. Я потратил час на то, чтобы понять, почему он жаловался на то, что не найдет подходящего конструктора.) –

Смежные вопросы