我目前正在使用Tensorflow处理四元数神经网络(我想使用GPU)。 TensorFlow不支持四元数,但可以表示而不是4x4实矩阵,因此可以在TensorFlow中构建这样的神经网络。
是否有一种简单的方法可以添加自定义操作或在张量上执行自定义操作?
例如,我可以写:
output_activation = tf.nn.softmax(tf.matmul(hidden_activation, Weight_to_ouput))
......那太酷了!您所要做的就是添加一个损失函数然后进行反向传播。但是,我想用四元数做同样的事情,例如:
output_activation = mySigmoid(myFunction(hidden_activation, Weight_to_output))
但是,我需要将四元数转换为张量或从张量转换以优化GPU计算。所以我需要创建一个函数,将一些张量作为参数并返回转换后的张量。
我看过py_func
,但似乎你无法返回张量。
我尝试了以下操作,但失败了:
def layerActivation(inputTensor,WeightTensor):
newTensor = tf.matmul(inputTensor,WeightTensor)
return newTensor
...并在main()
:
x = placeholder ...
W_to_hidden = tf.Variable
test = tf.py_func(layerActivation, [x,_W_to_hidden], [tf.float32])
with tf.Session() as sess:
tf.initialize_all_variables().run()
king_return = sess.run(test, feed_dict={x: qtrain})
错误:未实现:不支持的对象类型Tensor
理想情况下,我可以在TensorFlow的标准backprop算法中使用此output_activation
,但我不知道它是否可行。
答案 0 :(得分:4)
根据所需的功能,您可以将操作实现为现有TensorFlow操作的组合,而无需使用tf.py_func()
。
例如,以下工作并将在GPU上运行:
def layer_activation(input_tensor, weight_tensor):
return tf.matmul(input_tensor, weight_tensor)
# ...
x = tf.placeholder(...)
W_to_hidden = tf.Variable(...)
test = layer_activation(input_tensor, weight_tensor)
# ...
使用tf.py_func()
的主要原因是如果您的操作无法使用TensorFlow操作实现,并且您想要注入一些Python代码(例如使用NumPy),这些代码可以处理张量的实际值。
但是,如果您的mySigmoid()
或myFunction()
操作无法在现有的TensorFlow操作方面实施,并且您希望在GPU上实现它们,那么 - as keveman says - 您将需要添加新的操作。
答案 1 :(得分:2)
如果要在GPU上运行自定义操作,则必须在C ++中提供GPU实现(内核)。请查看文档here,了解如何使用自定义操作扩展TensorFlow,尤其是GPU support上的部分。