Умножьте слой на логическую маску в Keras, получив сообщение об ошибке: объект NoneType не имеет атрибута _inbound_nodes. - PullRequest
0 голосов
/ 28 марта 2019

Об этой ошибке много тем, но я не могу применить их к своему делу.Вот упрощенная версия того, что я пытаюсь сделать:

import numpy as np
from keras.models import Model
from keras.layers import Input, multiply, Dense, Lambda, Multiply
import keras.backend as K

Некоторые фиктивные данные:

xx = np.array([1,2,3]).reshape(3,1)
maskvec = np.array([1,2,3]).reshape(3,1)

Это функция для сравнения маски со значением в маске:

def compfun(x):
    comp = K.equal(x[0], x[1])
    return K.cast(comp, dtype = "float32")


inp = Input(shape = (1,))
lay = Dense(1)(inp)
mask = Input(shape = (1,))
m2 = Lambda(compfun)([mask, K.variable(2)]) #2 is a magic number.  In my use-case it'll be in a for-loop
masked = multiply([lay, m2])
model = Model(inputs = [inp, mask], outputs = [masked])

И страшные

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

Буду очень признателен за понимание того, что здесь происходит!Действительно бьюсь головой о стену.

Я пытался сделать второй аргумент compfun в массив, а не в константу, но я получаю ту же ошибку (я понятия не имею, может ли K.equalпринимать скаляры или нет, если другой аргумент является вектором)

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Вы можете изменить это так:

def compfun(x):
    comp = K.equal(x, K.variable(2))
    return K.cast(comp, dtype = "float32")


m2 = Lambda(compfun)(mask)
0 голосов
/ 28 марта 2019

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

for i in np.unique(loc_idx): 
    mask = Lambda(lambda x: K.cast(K.equal(x, i), dtype = "float32"))(loc_inp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...