web-dev-qa-db-fra.com

AttributeError: l'objet 'Tensor' n'a pas d'attribut '_keras_history'

J'ai cherché tous les "objets '' Tensor '' n'ont pas d'attribut ***" mais aucun ne semble être lié à Keras (sauf pour TensorFlow: AttributeError: l'objet 'Tensor' n'a pas d'attribut 'log10' qui n'a pas aidé.) ...

Je fais une sorte de GAN (Generative Adversarial Networks). Ici vous pouvez trouver la structure.

Layer (type)                     Output Shape          Param #         Connected to                     
_____________________________________________________________________________
input_1 (InputLayer)             (None, 30, 91)        0                                            
_____________________________________________________________________________
model_1 (Model)                  (None, 30, 1)         12558           input_1[0][0]                    
_____________________________________________________________________________
model_2 (Model)                  (None, 30, 91)        99889           input_1[0][0]                    
                                                                       model_1[1][0]                    
_____________________________________________________________________________
model_3 (Model)                  (None, 1)             456637          model_2[1][0]                    
_____________________________________________________________________________

J'ai pré-entraîné model_2 et model_3. Le problème est que je pré-entraine model_2 avec une liste composée de 0 et 1, mais model_1 renvoie des valeurs proches. J'ai donc envisagé d'arrondir model1_output, avec le code suivant: K.round () sur model1_out.

import keras.backend as K
[...]
def make_gan(GAN_in, model1, model2, model3):
    model1_out = model1(GAN_in)
    model2_out = model2([GAN_in, K.round(model1_out)])
    GAN_out = model3(model2_out)
    GAN = Model(GAN_in, GAN_out)
    GAN.compile(loss=loss, optimizer=model1.optimizer, metrics=['binary_accuracy'])
    return GAN
[...]

J'ai l'erreur suivante:

AttributeError: l'objet 'Tensor' n'a pas d'attribut '_keras_history'

Retraçage complet:

Traceback (most recent call last):
  File "C:\Users\Asmaa\Documents\BillyValuation\GFD.py", line 88, in <module>
GAN = make_gan(inputSentence, G, F, D)
  File "C:\Users\Asmaa\Documents\BillyValuation\GFD.py", line 61, in make_gan
GAN = Model(GAN_in, GAN_out)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\legacy\interfaces.py", line 88, in wrapper
return func(*args, **kwargs)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\topology.py", line 1705, in __init__
build_map_of_graph(x, finished_nodes, nodes_in_progress)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\topology.py", line 1695, in build_map_of_graph
layer, node_index, tensor_index)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\topology.py", line 1695, in build_map_of_graph
layer, node_index, tensor_index)
  File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\topology.py", line 1665, in build_map_of_graph
layer, node_index, tensor_index = tensor._keras_history
AttributeError: 'Tensor' object has no attribute '_keras_history'

J'utilise Python 3.6, avec Spyder 3.1.4, sous Windows 7. J'ai mis à niveau TensorFlow et Keras avec pip la semaine dernière ... Merci pour toute aide fournie!

7
Maëva LC

Mon problème est d'utiliser '+' pas 'ajouter' sur keras

11
peikuo

Puisque l'erreur vient directement d'ici:

Traceback (most recent call last):
  File "C:\Users\Asmaa\Documents\BillyValuation\GFD.py", line 88, in <module>
GAN = make_gan(inputSentence, G, F, D)
  File "C:\Users\Asmaa\Documents\BillyValuation\GFD.py", line 61, in make_gan
GAN = Model(GAN_in, GAN_out)

, et les entrées de vos modèles dépendent des sorties des modèles précédents, je crois que le bogue réside dans les codes de votre modèle.

Dans votre code de modèle, vérifiez ligne par ligne si vous appliquez ou non une opération autre que Keras , en particulier dans les dernières lignes. Par exemple, pour ajouter des éléments, vous pouvez utiliser intuitivement + ou même numpy.add, mais keras.layers.Add() devrait plutôt être utilisé.

5
Weisi Zhan

Essaye ça:

def make_gan(GAN_in, model1, model2, model3):
    model1_out = model1(GAN_in)
    model1_out = Lambda(lambda x: K.round(x), output_shape=...)(model1_out)
    model2_out = model2([GAN_in, model1_out])
    GAN_out = model3(model2_out)
    GAN = Model(GAN_in, GAN_out)
    GAN.compile(loss=loss, optimizer=model1.optimizer, metrics=['binary_accuracy'])
    return GAN
1
Daniel Möller