4 votes

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

Je suis en train de construire un modèle tel qu'illustré dans le diagramme ci-dessous. L'idée est de prendre plusieurs caractéristiques catégorielles (vecteurs one-hot) et de les incorporer séparément, puis de combiner ces vecteurs incorporés avec un tenseur 3D pour un LSTM.

Avec le code suivant en Keras2.0.2, lors de la création de l'objet Model() avec plusieurs entrées, une AttributeError: 'NoneType' object has no attribute 'inbound_nodes' similaire à cette question est soulevée. Est-ce que quelqu'un peut m'aider à comprendre quel est le problème ?

Modèle :

Modèle

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 des caractéristiques catégorielles
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])

#MESSAGE D'ERREUR
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 "", line 14, in 
    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'

7voto

lmartens Points 672

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)

0voto

M. Balcilar Points 51

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

par exemple, j'ai eu besoin d'ajouter l'opérateur moyen sur l'axe=1 dans mon modèle. Voici le code suppose que mon tenseur actuel s'appelle xinput et le tenseur de sortie est output, le code devrait être comme suit.

# supposons que mon tenseur s'appelle 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X