【问题标题】:Broadcasting dynamic dimension in Tensorflow在 Tensorflow 中广播动态维度
【发布时间】: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


【解决方案1】:

这是一种使用 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)

【讨论】:

  • 这行得通,谢谢。由于我也在处理一些更高阶的张量,我发现keras.backend.repeat_elements 也非常有用,因为它可以处理非 2 阶张量。
猜你喜欢
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
相关资源
最近更新 更多