これはおそらく愚かな質問ですが、テンソルフローのカスタム演算関数(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,0,0,0); –
'gdb'を付けてsegfaultsの場所を調べることができますか? Eigenは引数のいずれも検証しないので、このopを呼び出すときには範囲外のアクセスを生成することが可能です。 – mrry
パッチにアクセスするコードに1行追加しました。 "std :: cout <<" patch(0,0,0,0) "<< float(patch(0,0,0,0))<< std :: endl;" gdbはこれを問題の行として報告します。 フロートキャストなしで試してみました。 –