修改内置TensorFlow内核的最佳方法
我想学习修改TensorFlow内置操作符内核的最佳方法。 例如,我想修改tensorflow/core/kernels/resize_bicubic_op.cc中static const double A的值。我想出了两种可能的方法: 直接修改它并重新编译整个TensorFlow库。该解决方案的问题是:A.这会影响所有使用双三次插值的函数。这需要我重新编译整个库,从二进制文件安装时不起作用 将其定义为自定义op。问题是在源代码中,没有寄存器op。我不知道如何为这个双三次函数编写寄存器,以及是否需要进行其他修改 还有其他更好的方法吗修改内置TensorFlow内核的最佳方法,tensorflow,Tensorflow,我想学习修改TensorFlow内置操作符内核的最佳方法。 例如,我想修改tensorflow/core/kernels/resize_bicubic_op.cc中static const double A的值。我想出了两种可能的方法: 直接修改它并重新编译整个TensorFlow库。该解决方案的问题是:A.这会影响所有使用双三次插值的函数。这需要我重新编译整个库,从二进制文件安装时不起作用 将其定义为自定义op。问题是在源代码中,没有寄存器op。我不知道如何为这个双三次函数编写寄存器,以及是否
谢谢。解决此问题的最佳方法是构建自定义操作。有关如何添加自定义操作的更多详细信息,请参阅。OP的寄存器OP调用处于启用状态 另一种替代方法是重新使用相同的op注册,并使用替代实现注册一个新内核。这将使您能够使用实验API为ResizeBicubic op选择替代实现。例如,您可以在Python程序中执行以下操作:
_ = tf.load_op_library(...) # Load the .so containing your implementation.
with tf.get_default_graph().kernel_label_map({"ResizeBicubic": "my_impl"}):
images = tf.image.resize_bicubic(...) # Will use your implementation.
…并添加一个内核注册,用C++代码指定标签MyAuIMPL:
template <typename Device, typename T>
class MyResizeBicubicOp<Device, T> : public OpKernel {
// Custom implementation goes here...
}
#define REGISTER_KERNEL(T) \
REGISTER_KERNEL_BUILDER(Name("ResizeBicubic") \
.Device(DEVICE_CPU) \
.Label("my_impl") \
.TypeConstraint<T>("T") \
.HostMemory("size"), \
MyResizeBicubicOp<CPUDevice, T>);
TF_CALL_REAL_NUMBER_TYPES(REGISTER_KERNEL);
谢谢你,先生。这两种方法我都试过了,而且都奏效了。但是,性能非常差。自定义op比内置的resize_双三次体慢10倍。我直接从Tensorflow的resize_bicubic实现中复制了代码,除了添加这个新op所需的修改之外,我没有做任何更改。这正常吗?10倍的减速令人惊讶。在构建扩展时,您是否检查了编译器优化标志是否相同?我使用教程中提供的命令:TF_INC=$python-c'import tensorflow as TF;printf.sysconfig.get_include';g++-std=c++11-共享zero_out.cc-o zero_out.so-fPIC-I$TF_INCTry passing-O2-DNDEBUG.Yes。这就解决了减速问题。是否可以更新教程?