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) ?我做错了什么,我该如何解决?
最佳答案
点层沿最后一个轴执行矩阵乘法,因为它们是 3D
张量不是 2D
.所以你得到的形状反射(reflect)了这一点。您要做的是将产品带到每个输入的最后一列。相反,您可以取两个输入的元素乘积,然后沿最后一个轴求和。例如,
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
.
关于python - 3D 张量上的 Keras 点/点层行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51657476/