在 Tensorflow 中广播动态维度
Broadcasting dynamic dimension in Tensorflow
我正在使用来自 python 的 Tensorflow。我有两个张量我想连接(它也可能是另一个操作,我不认为确切的操作对这个问题很重要)。这些张量的形状定义为(N1 != N2 是正整数):
a: (None, N1)
b: (1 , N2)
由于我将沿着最后一个轴连接,所以似乎可以执行此操作。但是张量流拒绝了。代码
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])
任何关于如何连接(即正确广播或重复)这样 None
维度的建议都将不胜感激!
这是一种使用 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)
我正在使用来自 python 的 Tensorflow。我有两个张量我想连接(它也可能是另一个操作,我不认为确切的操作对这个问题很重要)。这些张量的形状定义为(N1 != N2 是正整数):
a: (None, N1)
b: (1 , N2)
由于我将沿着最后一个轴连接,所以似乎可以执行此操作。但是张量流拒绝了。代码
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])
任何关于如何连接(即正确广播或重复)这样 None
维度的建议都将不胜感激!
这是一种使用 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)