Skip to main content
 首页 » 编程设计

python之在 Tensorflow 中广播动态维度

2024年09月03日27mayingbao

我正在使用来自 python 的 Tensorflow。我有两个张量我想连接(它也可能是另一个操作,我不认为确切的操作对这个问题很重要)。这些张量的形状定义为(N1 != N2 是正整数):

a: (None, N1) 
b: (1   , N2) 

因为我将沿着最后一个轴连接,所以似乎可以执行此操作。但是 tensorflow 拒绝了。代码

from tensorflow import keras 
from tensorflow.keras import layers 
 
N1 = 2 
N2 = 3 
D1 = None 
 
a = keras.Input(shape=(D1, N1)) 
b = keras.Input(shape=(1, N2)) 
 
c = layers.Concatenate(axis=-1)([a, b]) 

失败

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, None, 2), (None, 1, 3)] 

我最接近完成这项工作的方法是使用 RepeatVector,如下所示,但不幸的是,这仅适用于静态尺寸,不适用于动态尺寸:

N1 = 2 
N2 = 3 
D1 = 7 
 
a = keras.Input(shape=(D1, N1)) 
b = keras.Input(shape=(N2)) 
b_repeated = layers.RepeatVector(D1)(b) 
 
c = layers.Concatenate()([a, b_repeated]) 

任何关于如何连接(即进行正确的广播或重复)与这样的无维度的建议将不胜感激!

请您参考如下方法:

这是使用 lambda 层执行此操作的方法:

import keras 
from keras import layers 
import keras.backend as K 
 
N1 = 2 
N2 = 3 
D1 = None 
 
a = keras.Input(shape=(D1, N1)) 
b = keras.Input(shape=(N2,)) 
c = layers.Lambda(lambda ab: K.concatenate([ab[0], K.repeat(ab[1], K.shape(ab[0])[1])], 
                                           axis=-1))([a, b]) 
print(c) 
# Tensor("lambda_1/concat:0", shape=(?, ?, 5), dtype=float32)