以 None 作为第一维的 Tensorflow Keras 张量乘法

Tensorflow Keras Tensor Multiplication with None as First Dimension

我正在使用 TensorFlow Keras 后端,我有两个相同形状的张量 ab(None, 4, 7),其中 None 表示批次维度。

我想做矩阵乘法,我期待 (None, 4, 4) 的结果。
即对于每批,做一个matmul:(4,7)·(7,4) = (4,4)

这是我的代码 --

K.dot(a, K.reshape(b, (-1, 7, 4)))

此代码给出形状为 (None, 4, None, 4)

的张量

我想知道高维矩阵乘法是如何工作的?正确的做法是什么?

IIUC,您可以直接使用 tf.matmul 作为模型的一部分并转置 b 或明确地将操作包装在 Lambda 层中:

import tensorflow as tf

a = tf.keras.layers.Input((4, 7))
b = tf.keras.layers.Input((4, 7))
output = tf.matmul(a, b, transpose_b=True)
model = tf.keras.Model([a, b], output)
model.summary()
Model: "model_1"
__________________________________________________________________________________________________
 Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================
 input_15 (InputLayer)          [(None, 4, 7)]       0           []                               
                                                                                                  
 input_16 (InputLayer)          [(None, 4, 7)]       0           []                               
                                                                                                  
 tf.linalg.matmul_2 (TFOpLambda  (None, 4, 4)        0           ['input_15[0][0]',               
 )                                                                'input_16[0][0]']               
                                                                                                  
==================================================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
__________________________________________________________________________________________________

或者

import tensorflow as tf

a = tf.keras.layers.Input((4, 7))
b = tf.keras.layers.Input((4, 7))
output = tf.keras.layers.Lambda(lambda x: tf.matmul(x[0], x[1], transpose_b=True))([a, b])
model = tf.keras.Model([a, b], output)
model.summary()