Keras documentation for the dot/Dot layer指出:
“计算两个张量的样本之间的点积的层。
例如如果应用于形状为(batch_size,n)的两个张量a和b的列表,则输出将为形状(batch_size,1)的张量,其中每个条目i将是a [i]和b [i之间的点积]。
参数
轴:整数,整数或元组,沿其取点积的一个或多个轴。”
我不明白这一点,这是一个快速,可重复的示例来演示:
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)?我在做什么错,我该如何解决?
答案 0 :(得分:2)
由于这些点是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
广播。