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

Tensorflow 如何在Keras/Tf中实现两层张量积,tensorflow,keras,linear-algebra,Tensorflow,Keras,Linear Algebra,我试图建立一个用于分类的DNN,在某一点上,我想取向量的张量积。我目前正在使用Keras函数API,但目前还不清楚是否有一个层已经实现了这一点 我一直试图使用Lambda层和numpy来尝试这个,但它不起作用。 在谷歌上搜索一下就会发现 tf.linalg.lineropertornecker,它似乎也不起作用 以下是我尝试过的: 我有一个名为part\u layer的层,它的输出是一个向量(秩1张量) keras.layers.Lambda(Lambda x_数组:np.outer(x_数组,

我试图建立一个用于分类的DNN,在某一点上,我想取向量的张量积。我目前正在使用Keras函数API,但目前还不清楚是否有一个层已经实现了这一点

我一直试图使用Lambda层和numpy来尝试这个,但它不起作用。 在谷歌上搜索一下就会发现
tf.linalg.lineropertornecker
,它似乎也不起作用

以下是我尝试过的: 我有一个名为
part\u layer
的层,它的输出是一个向量(秩1张量)

keras.layers.Lambda(Lambda x_数组:np.outer(x_数组,x_数组),)(part_层))
理想情况下,我希望这个向量的形式是
[1,2]
,然后给我
[[1,2],[2,4]
。 但是我得到的错误表明,
np.outer
函数无法识别其参数:

AttributeError:'numpy.ndarray'对象没有属性'\u keras\u history'
关于下一步尝试什么,或者是否有一个简单的函数可以使用,有什么想法吗?

使用
tf.tensordot(x\u数组,x\u数组,axes=0)
来实现您想要的。例如,表达式
print(tf.tensordot([1,2],[1,2],axes=0))
给出了所需的结果:
[[1,2],[2,4]


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

您可以使用两种操作:

如果您想考虑批次大小,可以使用

否则,您可以使用

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

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)

希望有帮助。

尝试
tf.tensordot(x_数组,x_数组,axes=0)
而不是使用Numpy的
np.outer
。这不是给我一个标量而不是二阶张量吗?@Gilles PhilippePaillé请重新陈述你的答案-我后来通过使用重塑层解决了这个问题。谢谢你的回答,但不幸的是,这不起作用。例如,虽然此层的输入具有形状(无,5),但输出具有形状(无,5,无,5),而不是我想要的形状(无,5,5)。实际上,使用
x=Lambda(Lambda x_数组:tf.tensordot(x_数组,x_数组,axis=0))(x)
再次尝试此操作,然后通过
x=Lambda(Lambda x_数组:tf.transpose)应用转置层(x_数组,perm=[0,2,1,3])(x)
修复上述输出问题,最后通过
x=Lambda进行切片(Lambda x_数组:x_数组[0,:,:,:,:])(x)
谢谢-我得到了以前的工作答案,但我将在网络的下一次迭代中尝试这个方法。