2016-05-31 19 views
0

これはおそらく愚かな質問ですが、テンソルフローのカスタム演算関数(void Compute)内からEigen :: Tensorクラス関数にアクセスするのが難しいです。C++ Tensorflow :: TensorオブジェクトのEigen :: Tensorクラス関数へのアクセス

Eigen :: Tensorには、オペレーションの内側からアクセスしたい「extract_patches」というメンバー関数があります。テンソルオブジェクトを "typeid()"すると、tensorflow :: Tensorが返されます。どのように根本的なEigen :: Tensorにアクセスするのですか?

「extract_patches」のコードは、Eigenのドキュメントから直接得られることに注意してください。

#include "tensorflow/core/framework/op.h" 
#include "tensorflow/core/framework/op_kernel.h" 
#include "tensorflow/core/util/padding.h" 
#include "tensorflow/core/framework/numeric_op.h" 
#include "tensorflow/core/util/tensor_format.h" 
#include <vector> 
#include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor" 

using namespace tensorflow; 

class SauronOp : public OpKernel { 
public: 
    explicit SauronOp(OpKernelConstruction* context) : OpKernel(context) {// Some checks} 

    void Compute(OpKernelContext* context) override { 

    //declare temporary storage 
    TensorShape a_shape_temp({act_in_batch, act_in_rows, act_in_cols }); 
    Tensor a_temp; 
    OP_REQUIRES_OK(context, context->allocate_temp(DataTypeToEnum<float>::value, 
             a_shape_temp, &a_temp)); 
    //auto a_matrix = a_temp.shaped<float,3>({{act_in_batch, act_in_rows, act_in_cols }); 
    auto a_tensor = a_temp.tensor<float,3>(); 

    //unrelated stuff 

    Eigen::Tensor<float, 4> patch; 
    Eigen::array<ptrdiff_t, 3> patch_dims; 
    patch_dims[0] = filter_height; 
    patch_dims[1] = filter_width; 
    patch_dims[2] = act_in_cols; 

// THIS LINE GENERATES THIS PROBLEM (sorry for yelling) 
    patch = a_tensor.extract_patches(patch_dims); 

// output for debug 
    std::cout<<"type "<< typeid(a_tensor).name()<<std::endl; 
    std::cout<<"type "<< typeid(a_temp).name()<<std::endl; 
    } 

出力

type N5Eigen9TensorMapINS_6TensorIfLi3ELi1ElEELi16EEE 
type N10tensorflow6TensorE 

答えて

0

私はこの問題は、extract_patches()が(未評価の式を表す)Eigen::TensorPatchOp<...>としない(評価値を表す)Eigen::Tensor<...>を返すことである疑い。この作業を行うには、(i).extract_patches()の結果に.eval()を呼び出し、(ii)patchを行優先として宣言して、目的のタイプのオブジェクトを取得する必要があります。

次のコードは、Compute()方法で私のためにコンパイルされます。

Tensor a_temp; 
// Initialize `a_temp`... 

const auto& a_tensor = a_temp.shaped<float, 3>(
    {act_in_batch, act_in_rows, act_in_cols}); 

Eigen::array<ptrdiff_t, 3> patch_dims; 
patch_dims[0] = filter_height; 
patch_dims[1] = filter_width; 
patch_dims[2] = act_in_cols; 

const auto& patch_expr = a_tensor.extract_patches(patch_dims); 

Eigen::Tensor<float, 4, Eigen::RowMajor> patch = patch_expr.eval(); 
+0

コードコンパイルを、私はパッチにアクセスしようとすると、それがセグメンテーションフォールト。 パッチ(0,0,0,0); –

+0

'gdb'を付けてsegfaultsの場所を調べることができますか? Eigenは引数のいずれも検証しないので、このopを呼び出すときには範囲外のアクセスを生成することが可能です。 – mrry

+0

パッチにアクセスするコードに1行追加しました。 "std :: cout <<" patch(0,0,0,0) "<< float(patch(0,0,0,0))<< std :: endl;" gdbはこれを問題の行として報告します。 フロートキャストなしで試してみました。 –

関連する問題