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:
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'
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)
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.