Tensorflow:TysFooFrand如何连接Python和C++?

2024-10-04 03:28:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的事

我试图对tensorflow中的conv_ops进行一些修改,使其用于卷积的滤波器只由二进制数组成。在

我所做的

按照this tensorflow issue中的建议,我没有创建自定义操作。相反,我只是复制conv_ops.cc中的代码并更改名称,如from

REGISTER_KERNEL_BUILDER(
Name("Conv2D").Device(DEVICE_GPU).TypeConstraint<Eigen::half>("T"),
Conv2DOp<GPUDevice, Eigen::half>);
REGISTER_KERNEL_BUILDER(
Name("Conv2D").Device(DEVICE_GPU).TypeConstraint<float>("T"),
Conv2DOp<GPUDevice, float>);

^{pr2}$

在所有的修改之后,我成功地创建了一个与conv_ops相同的新操作。然后为了绕过functor:sign中的问题 //tensorflow/core/kernels/cwise_ops.h不像//tensorflow/core/kernels/relu_op_functor.h中的functor:Relu那样容易使用。我决定添加一个输入(binarized_filter)到我的新操作BinaryConv2D。这样我就可以使用optf.sign来安全地生成一个二进制过滤器。在

我的问题是什么

虽然我已将nn_ops.cc中的注册更改为

REGISTER_OP("BinaryConv2D")
    .Input("input: T")
    .Input("filter: T")
    .Input("binarized_filter: T")
    .Output("output: T")
    .Attr("T: {half, float, double}")
    .Attr("strides: list(int)")
    .Attr("use_cudnn_on_gpu: bool = true")
    .Attr(GetPaddingAttrString())
    .Attr(GetConvnetDataFormatAttrString())

生成的python代码变成:

result = _op_def_lib.apply_op("BinaryConv2D", input=input, filter=filter,
                                binarized_filter=binarized_filter,
                                strides=strides, padding=padding,
                                use_cudnn_on_gpu=use_cudnn_on_gpu,
                                data_format=data_format, name=name)

我在里面用一个符号op得到binarized_filter

  import tensorflow as tf
  binarized_filter = tf.sign(filter)

我得到一个错误:

W tensorflow/core/framework/op_kernel.cc:926] Invalid argument: Signature mismatch, have: float, float, float->float expected: float, float->float
E tensorflow/core/common_runtime/executor.cc:334] Executor failed to create kernel. Invalid argument: Signature mismatch, have: float, float, float->float expected: float, float->float
     [[Node: conv1/BinaryConv2D = BinaryConv2D[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/cpu:0"](shuffle_batch, conv1/weights/read, conv1/Sign)]]
E tensorflow/core/client/tensor_c_api.cc:485] Signature mismatch, have: float, float, float->float expected: float, float->float
     [[Node: conv1/BinaryConv2D = BinaryConv2D[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/cpu:0"](shuffle_batch, conv1/weights/read, conv1/Sign)]]
Traceback (most recent call last):

我检查了//tensorflow/python/framework/op_def_library.py中图形中输入类型的值。他们是对的。所以我假设C++中定义的输入号仍然不正确,但是我找不到任何示例或文档,除了源代码可以提供有关C++代码和Python代码的关系的信息。我真的很想知道,在我的修改过程中,我是否错过了构建op的任何部分。在


Tags: coreuseontensorflowfloatfilteropscc