如何在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)
希望对您有所帮助。
我正在尝试建立一个用于分类的 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)
希望对您有所帮助。