Das ist wahrscheinlich eine blöde Frage, aber ich habe Schwierigkeiten beim Zugriff auf eine Eigen :: Tensor-Klassenfunktion aus einer benutzerdefinierten Op-Funktion (void Compute) in Tensorflow.C++ Zugriff auf die Eigen :: Tensor-Klasse-Funktion von Tensorflow :: Tensor-Objekt
Eigen :: Tensor hat eine Memberfunktion namens "extract_patches", auf die ich von innerhalb des op zugreifen möchte. Wenn ich das Tensorobjekt "typid()", gibt es Tensorflow :: Tensor zurück. Wie gelangt man zum zugrundeliegenden Eigen :: Tensor?
Beachten Sie, dass der Code für "extract_patches" direkt aus der Eigen-Dokumentation stammt.
#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;
}
Ausgabe
type N5Eigen9TensorMapINS_6TensorIfLi3ELi1ElEELi16EEE
type N10tensorflow6TensorE
Der Code kompiliert, aber es Segfaults wenn ich versuche, den Patch zuzugreifen. Patch (0,0,0,0); –
Können Sie versuchen, 'gdb' anzuhängen, um herauszufinden, wo es segregiert? Beachten Sie, dass Eigen eines der Argumente nicht validiert. Daher ist es möglich, beim Aufruf dieses Ops einen Out-of-Bounds-Zugriff zu generieren. – mrry
Ich habe dem Code, der auf den Patch zugreift, eine einzelne Zeile hinzugefügt. "std :: cout <<" patch (0,0,0,0) "<< float (patch (0,0,0,0)) << std :: endl;" gdb meldet dies als die beleidigende Zeile. Ich habe es mit und ohne den Schwimmer vergeblich versucht. –