web-dev-qa-db-fra.com

Keras Multi-inputs AttributeError: l'objet 'NoneType' n'a pas d'attribut 'inbound_nodes'

J'essaie de construire un modèle comme illustré dans le diagramme ci-dessous. L'idée est de prendre plus d'une entité catégorielle (un seul vecteur) et de l'intégrer séparément, puis de combiner ces vecteurs intégrés avec un tenseur 3D pour un LSTM.

Avec le code suivant dans Keras2.0.2 , lors de la création de l'objet Model() avec plusieurs entrées, il lève un AttributeError: 'NoneType' object has no attribute 'inbound_nodes' similaire à this question. Quelqu'un peut-il m'aider à comprendre quel est le problème?

Modèle:

Model

Code:

from keras.layers import Dense, LSTM, Input
from keras.layers.merge import concatenate
from keras import backend as K
from keras.models import Model

cat_feats_dims = [315, 14] # Dimensions of the cat_feats
emd_inputs = [Input(shape=(in_size,)) for in_size in cat_feats_dims]
emd_out = concatenate([Dense(20, use_bias=False)(inp) for inp in emd_inputs])
emd_out_3d = K.repeat(emd_out, 10)

lstm_input = Input(shape=(10,5))

merged = concatenate([emd_out_3d,lstm_input])

lstm_output = LSTM(32)(merged)
dense_output = Dense(1, activation='linear')(lstm_output)

model = Model(inputs=emd_inputs+[lstm_input], outputs=[dense_output])

#ERROR MESSAGE
Traceback (most recent call last):
  File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-a9da7f276aa7>", line 14, in <module>
    model = Model(inputs=emd_inputs+[lstm_input], outputs=[dense_output])
  File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\legacy\interfaces.py", line 88, in wrapper
    return func(*args, **kwargs)
  File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1648, in __init__
    build_map_of_graph(x, seen_nodes, depth=0)
  File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1644, in build_map_of_graph
    layer, node_index, tensor_index)
  File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1644, in build_map_of_graph
    layer, node_index, tensor_index)
  File "C:\Program Files\Anaconda2\envs\mle-env\lib\site-packages\keras\engine\topology.py", line 1639, in build_map_of_graph
    next_node = layer.inbound_nodes[node_index]
AttributeError: 'NoneType' object has no attribute 'inbound_nodes'
7
LingxB

keras.backend.repeat est une fonction, pas une couche. Essayez d'utiliser keras.layers.core.RepeatVector à la place. Il a la même fonctionnalité que la fonction.

emd_out_3d = RepeatVector(10)(emd_out)
9
lmartens

Pas seulement pour ce cas, mais dans le cas général, si vous souhaitez ajouter une fonction dans votre modèle qui n'a pas d'implémentation de couche équivalente, vous pouvez faire de cette fonction une couche Lambda.

par exemple, j'avais besoin d'ajouter un opérateur moyen sur l'axe = 1 dans mon modèle. Voici le code comme supposé mon tenseur actuel nommé xinput et le tenseur de sortie est sorti, le code devrait être le suivant.

# suppose my tensor named xinput
meaner=Lambda(lambda x: K.mean(x, axis=1) )
agglayer = meaner(xinput)    
output = Dense(1, activation="linear", name="output_layer")(agglayer)

Au lieu d'utiliser la fonction Lambda, mais en ajoutant directement la fonction K.mean, vous obtiendrez la même erreur.

4
M. Balcilar