Трансляция динамического измерения в Tensorflow - PullRequest
2 голосов
/ 15 октября 2019

Я использую Tensorflow из Python. У меня есть два тензора, которые я хочу объединить (это может быть и другая операция, я не думаю, что точная операция имеет значение для этого вопроса). Эти тензоры имеют свою форму, определенную как (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 размерами, будут высоко оценены!

1 Ответ

2 голосов
/ 15 октября 2019

Вот способ сделать это с лямбда-слоем:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...