批量处理张量

时间:2019-06-20 22:55:31

标签: python numpy tensorflow keras tensor

我需要分别获取张量的每一行的外积。代码如下:

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。

2 个答案:

答案 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的更多信息。