Keras dot/Dot 3D 张量的层行为

Keras dot/Dot layer behavior on 3D tensors

Keras documentation for the dot/Dot layer 指出:

“计算两个张量中样本之间的点积的层。

例如如果应用于形状为 (batch_size, n) 的两个张量 a 和 b 的列表,输出将是形状为 (batch_size, 1) 的张量,其中每个条目 i 将是点积a[i] 和 b[i].

参数

axes:整数或整数元组、轴或沿其进行点积的轴。

我没听懂,这里有一个快速、可重现的示例来演示:

from keras.layers import Input, dot
input_a = Input(batch_shape=(99,45000,300))
input_b = Input(batch_shape=(99,45000,300))
element_wise_dot_product = dot([input_a,input_b], axes = -1)
print(input_a.get_shape(),input_b.get_shape(),element_wise_dot_product.get_shape()) 

输出:(99, 45000, 300) (99, 45000, 300) (99, 45000, 45000)

为什么元素明智的点积形状不是 (99,45000,1)?我做错了什么,我该如何解决?

点层沿最后一个轴执行矩阵乘法,因为这些是 3D 张量而不是 2D。所以你得到的形状反映了这一点。您要做的是将产品放在每个输入的最后一列中。相反,您可以取两个输入的元素乘积,然后沿最后一个轴求和。例如,

import keras.backend as K
import tensorflow as tf

K.sum(tf.multiply(input_a, input_b[:tf.newaxis]), axis=-1, keepdims=True)

如果您只需要 keras 解决方案,您可以使用 keras.layers.multiply 代替 tf.multiply 并使用 K.expand_dims 代替 tf.newaxis 的广播。