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

标签 python python-3.x keras keras-layer keras-2

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/

相关文章:

python - Python 中的梅森数公式

apache-spark - 如何在 Spark 数据帧上训练神经网络自动编码器 (Keras)

Python 导入错误 : cannot import name '_imagingtk' in virtualenv

python - 从 Python 查找 MacOSX 版本

python - 为什么 izip() 的这个实现不起作用?

python - 在导入 pandas 之前我需要导入 NumPy 还是可以单独使用 pandas ?

python - 用 '+' 加入字符串中的列表项

python-3.x - 在 Tkinter 的 MCV 设计模式中,控制窗口属性的函数应该放在哪里?

python - 如何使用 IP 地址作为神经网络中的特征

python - "model.trainable = False"在 Keras 中是什么意思?