如何在Keras/Tf中实现两层的张量积

How to implement the tensor product of two layers in Keras/Tf

我正在尝试建立一个用于分类的 DNN,有一次我想将向量的张量积与自身相乘。我目前正在使用 Keras 功能 API,但目前还不清楚是否已经有一个层可以做到这一点。

我一直在尝试使用 Lambda 层和 numpy 来尝试这个,但它不起作用。 做一些谷歌搜索揭示 tf.linalg.LinearOperatorKronecker,好像也不行。

这是我尝试过的: 我有一个名为 part_layer 的层,其输出是单个向量(一级张量)。

keras.layers.Lambda(lambda x_array: np.outer(x_array, x_array),) ( part_layer) )

理想情况下,我希望它采用 [1,2] 形式的向量并给我 [[1,2],[2,4]]。 但是我得到的错误表明 np.outer 函数没有识别它的参数:

AttributeError: 'numpy.ndarray' object has no attribute '_keras_history 

关于下一步尝试什么的任何想法,或者是否有一个简单的功能可以使用?

使用tf.tensordot(x_array, x_array, axes=0)来实现你想要的。例如,表达式 print(tf.tensordot([1,2], [1,2], axes=0)) 给出了期望的结果:[[1,2],[2,4]].

Keras/Tensorflow 需要保留应用于张量的操作历史记录以执行优化。 Numpy 没有历史概念,因此不允许在层中间使用它。 tf.tensordot 执行相同的操作,但保留历史。

您可以使用两种操作:

如果要考虑批量大小可以使用the Dot function

否则,您可以使用the dot function

在这两种情况下,代码应如下所示:

dot_lambda = lambda x_array: tf.keras.layers.dot(x_array, x_array)
# dot_lambda = lambda x_array: tf.keras.layers.Dot(x_array, x_array)
keras.layers.Lambda(dot_lamda)( part_layer)

希望对您有所帮助。