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
的广播。
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
的广播。