Ошибка в лямбда-слое Keras при добавлении или умножении на постоянные нетензорные числа - PullRequest
2 голосов
/ 24 июня 2019

Я пытаюсь спроектировать сетевую архитектуру, чтобы у меня был слой следующим образом:

x = k.Input(shape=(1,))
y = k.layers.Dense(1)(x + 1)  #k.backend.constant(1) -- no difference
Fx = k.models.Model(x, y)

Хотя «x + 1» является корректной операцией Tensorflow, я получаю ошибку NoneType:

AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes'

Когда я пытаюсь использовать слой Lambda, чтобы обойти эту ситуацию, я получаю ту же ошибку:

x = k.Input(shape=(1,))
xx = k.layers.Lambda(lambda x: x[0] + x[1])(
    [x, k.backend.constant(1, shape=(1,1))]
)
y = k.layers.Dense(1)(xx)
Fx = k.models.Model(x, y)

Однако я могу взломать это, выполнив:

x = k.Input(shape=(1,))
xx = k.layers.Lambda(lambda x: x[0]+1)([x, x])
y = k.layers.Dense(1)(xx)
Fx = k.models.Model(x, y)

Поскольку Tensor + (int или float) является законной операцией Tensorflow.

Я ошибаюсь в определении лямбда-слоя или это ошибка на конце Keras?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Причина неверного y = k.layers.Dense(1)(x + 1) в том, что + 1 является допустимой тензорной операцией.Модели Keras, как определено в терминах слоев Keras;не тензоры.Так что вам нужно использовать x_p = Lambda(lambda x: x + 1)(x).Далее указан правильный способ указать требуемую операцию.

т.е. lambda x: x + 1 - это операция над тензорами, а Lambda () создает слой.Слои - это то, как Keras отслеживает зависимости между слоями / построением графика и т. Д. Например, этот лямбда-слой узнает формат своей входной формы, когда Keras строит график, а затем вычисляет выходную форму.В вашем случае формы похожи, но, например, вы можете использовать лямбда-функцию, которая выполняет операцию нарезки тензора и изменяет выходную форму.

0 голосов
/ 24 июня 2019

Я не знаю, почему вы переходите с

x + 1

до

 x[0]+1

если вы просто хотите добавить 1 к элементам в x до прохождения его через плотный слой, тогда вы можете просто применить лямбда-слой следующим образом:

x = k.Input(shape=(1,))
xx = k.layers.Lambda(lambda x: x + 1)(x)
y = k.layers.Dense(1)(xx)
Fx = k.models.Model(x, y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...