我需要分别获取张量的每一行的外积。代码如下:
input1 = K.placeholder(shape =(None,12)) prod = K.map_fn(someMethod,input1)
someMethod需要执行以下操作:
*def someMethod(x):*
## get the outerproduct row-wise of input1 #
outer=x*x.T
## subtract the identity matrix from the outer product #
diff=outer-np.eye(12)
## and return the trace of the difference matrix #
trace=np.trace(diff)
return trace
我希望跟踪值是一个标量,但prod可以是批量大小的输入列表?我正在使用plaidml作为后端,因此希望使用numpy或keras后端工作,或者也许使用tensorflow。
答案 0 :(得分:1)
您好,欢迎来到Stack Overflow。
对于矩阵A的按行外积,请使用以下内容:
outer_product = np.matmul(A[:,:,np.newaxis], A[:,np.newaxis,:])
答案 1 :(得分:0)
以下示例在形状为x
的张量[None, None]
(可变批大小和可变矢量尺寸)上执行请求的操作。它已在Tensorflow 1.13.1和2.0RC中进行了测试(对于{2.0,必须删除tf.placeholder
)。出于说明目的,注释假定输入形状为[None, 12]
。
import tensorflow as tf
x = tf.placeholder(tf.float32, shape=[None, None]) # Remove for TF 2.0
# Explicitly perform batch-wise outer product using Einstein summation notation
outer = tf.einsum('bi, bj -> bij', x, x)
outer.shape
# TensorShape([Dimension(None), Dimension(12), Dimension(12)])
diff = outer - tf.eye(tf.shape(x)[1])
trace = tf.linalg.trace(diff)
trace.shape
# TensorShape([Dimension(None)])
如您所见,Tensorflow不需要在输入的批处理维度上映射帮助函数。您可以了解有关tf.einsum
here的更多信息。