【发布时间】:2019-10-15 23:32:42
【问题描述】:
我正在使用来自 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 尺寸将不胜感激!
【问题讨论】:
-
您不能直接将具有形状
(None, N1)和(1, N2)的张量沿第二个轴连接起来,正如消息中所说,所有其他维度(这里只有第一个维度)应该具有相同的大小。你想重复第二个张量的次数与第一个张量的第一个维度一样多,然后然后连接吗? -
重复张量然后连接就可以了!有没有办法做到这一点?
标签: python tensorflow keras array-broadcasting