0

我的项目需要一个新层,它需要 Tensor 的新运算符来计算输入 x 和常量 Key k 之间的按位异或。例如 x = 4(位形式:100),k = 7 (111),bitwiseXOR(x, k) 期望为 3 (011)。

据我所知,Tensor 只有布尔类型的 LogicXOR 运算符。幸运的是,Tensorflow 具有扩展能力,可以拥有一个新的 Op。但是,我阅读了https://www.tensorflow.org/extend/adding_an_op中的文档,我可以得到基本的想法,但这离实现还很远,可能是因为缺乏 c++ 知识。任何有关实施新运营商的建议都会有所帮助。然后我可以使用 Tensor 的新 Op 来构建新层。

4

1 回答 1

0

如果您不想实现自己的 C++ 操作,可以尝试使用tf.py_func,它允许您定义一个对数组进行操作的 python 函数,numpy然后在图中用作 Tensorflow 操作。

对于您的问题,您可以使用numpy's bitwise_xor()

import tensorflow as tf
import numpy as np

t1 = tf.constant([2,4,6], dtype=tf.int64)
t2 = tf.constant([1,3,5], dtype=tf.int64)

t_xor = tf.py_func(np.bitwise_xor, [t1, t2], tf.int64, stateful=False)

with tf.Session() as sess:
  val = sess.run(t_xor)
  print(val)

[3,7,3]按预期打印。

请注意此功能的已知限制(取自上面的链接):

注意tf.py_func()操作具有以下已知限制:

  • 函数体(即 func)不会在 GraphDef. 因此,如果您需要序列化模型并在不同的环境中恢复它,则不应使用此功能。
  • 该操作必须与调用tf.py_func(). 如果您使用分布式 TensorFlow,则必须在与调用程序相同的进程中运行 tf.train.Server,tf.py_func()并且必须将创建的操作固定到该服务器中的设备(例如使用with tf.device():)。
于 2017-06-21T14:54:12.410 回答