我要做的事
我试图对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的任何部分。在
目前没有回答
相关问题 更多 >
编程相关推荐