Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 添加自定义稀疏运算(稀疏行列式)_C++_Tensorflow - Fatal编程技术网

C++ 添加自定义稀疏运算(稀疏行列式)

C++ 添加自定义稀疏运算(稀疏行列式),c++,tensorflow,C++,Tensorflow,我正在尝试在Tensorflow中使用一些稀疏矩阵运算。我要解决的第一个问题是稀疏行列式,通过稀疏Cholesky分解。伊根有一个稀疏的Cholesky,所以我的想法是把它包起来 我一直在进步,但现在有点卡住了。我知道Tensorflow中的稀疏传感器由三部分组成:索引,值,和形状。复制类似的操作时,我选择了以下寄存器\u OP声明: REGISTER_OP("SparseLogDet") .Input("a_indices: int64") .Input("a_values:

我正在尝试在Tensorflow中使用一些稀疏矩阵运算。我要解决的第一个问题是稀疏行列式,通过稀疏Cholesky分解。伊根有一个稀疏的Cholesky,所以我的想法是把它包起来

我一直在进步,但现在有点卡住了。我知道Tensorflow中的稀疏传感器由三部分组成:
索引
,和
形状
。复制类似的操作时,我选择了以下
寄存器\u OP
声明:

REGISTER_OP("SparseLogDet")
    .Input("a_indices: int64")
    .Input("a_values: float32")
    .Input("a_shape: int64")
    .Output("determinant: float32")
    .SetShapeFn([](::tensorflow::shape_inference::InferenceContext* c) {
      shape_inference::ShapeHandle h;
      c->set_output(0, h);
      return Status::OK();
    });
这可以很好地编译,但当我使用一些示例代码运行它时:

import tensorflow as tf

log_det_op = tf.load_op_library('./sparse_log_det_op.so')

with tf.Session(''):
  t = tf.SparseTensor(indices=[[0, 0], [1, 2]], values=[1, 2],
                      dense_shape=[3, 4])
  print(log_det_op.sparse_log_det(t).eval().shape)
  print(log_det_op.sparse_log_det(t).eval())
它抱怨说:

TypeError:sparse\u log\u det()缺少两个必需的位置参数:“a\u值”和“a\u形状”

这对我来说很有意义,因为它期待着其他的论点。然而,我真的只想传递稀疏张量,而不是将其分解为组件!有人知道其他稀疏操作是如何处理的吗


谢谢

如果您希望传入稀疏张量,然后从中确定
索引
形状
,这应该是可能的。只需修改OP以获取单个
张量
输入,并生成单个
浮点
输出。然后通过元素循环,从特征::张量中提取所需信息,如下所示:

#include "tensorflow/core/framework/op.h"
#include "tensorflow/core/framework/shape_inference.h"
#include "tensorflow/core/framework/op_kernel.h"
#include <Eigen/Dense>

using namespace tensorflow;

REGISTER_OP("SparseDeterminant")
    .Input("sparse_tensor: float")
    .Output("sparse_determinant: float");


class SparseDeterminantOp : public OpKernel {
public:
    explicit SparseDeterminantOp(OpKernelConstruction *context) : OpKernel(context) {}

    void Compute(OpKernelContext *context) override {

   // get the input tesnorflow tensor
   const Tensor& sparse_tensor = context->input(0);  
   // get shape of input
   const TensorShape& sparse_shape = sparse_tensor.shape();

   // get Eigen Tensor for input tensor
   auto eigen_sparse = sparse_tensor.matrix<float>();

   //extract the data you want from the sparse tensor input
   auto a_shape = sparse_tensor.shape();

   // loop over all elements of the input tensor and add to values and indices
   for (int i=0; i<a_shape.dim_size(0); ++i){
    for (int j=0; j<a_shape.dim_size(1); ++j){
        if(eigen_sparse(i,j) != 0){
        /// ***Here add non zero elements to list/tensor of values and their indicies*** 
            std::cout<<eigen_sparse(i,j)<<" at"<<" "<<i<<" "<<j<<" "<<"not zero."<<std::endl;
        }
    }
   }

   // create output tensor
   Tensor *output_tensor = NULL;      
   TensorShape output_shape;
   OP_REQUIRES_OK(context, context->allocate_output(0, output_shape, &output_tensor));
   auto output = output_tensor->scalar<float>();

   output(0) = 1.; //**asign return value***;

    }
};
REGISTER_KERNEL_BUILDER(Name("SparseDeterminant").Device(DEVICE_CPU), SparseDeterminantOp);
//run.py
import tensorflow as tf
import numpy as np

my_module = tf.load_op_library('./out.so')

# create sparse matrix
a = np.zeros((10,10))
for i in range(len(a)):
    a[i,i] = i

print(a)

a_t = tf.convert_to_tensor(a, dtype= float)

with tf.Session() as sess:
    sess.run(my_module.sparse_determinant(a_t))