3D 张量上的 Keras 点/点层行为

Kat*_*mli 6 python python-3.x keras keras-layer keras-2

点/点层Keras 文档指出:

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

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

参数

轴:整数或整数元组,轴或轴,沿其取点积。”

我没有得到这个,这是一个快速、可重复的示例来演示:

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()) 
Run Code Online (Sandbox Code Playgroud)

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

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

mod*_*itt 5

点层沿最后一个轴执行矩阵乘法,因为这些不是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)
Run Code Online (Sandbox Code Playgroud)

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