AttributeError: ‘Tensor’-object heeft geen kenmerk ‘_keras_history’

Ik heb gezocht naar alle “‘Tensor’-objecten hebben geen attribuut ***” maar geen enkele lijkt gerelateerd aan Keras (behalve TensorFlow: AttributeError: ‘Tensor’-object heeft geen kenmerk ‘log10’wat niet hielp)…

Ik maak een soort GAN (Generative Adversarial Networks). Hier vind je de structuur.

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]                    
_____________________________________________________________________________

Ik heb model_2 en model_3 vooraf getraind. Het punt is dat ik model_2 vooraf heb getraind met een lijst gemaakt van 0 en 1, maar model_1 retourneerde waarden. Dus ik overwoog om de model1_output af te ronden, met de volgende code: de K.round() op 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
[...]

Ik heb de volgende foutmelding:

AttributeError: ‘Tensor’-object heeft geen kenmerk ‘_keras_history’

Volledige traceback:

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'

Ik gebruik Python 3.6, met Spyder 3.1.4, op Windows 7. Ik heb vorige week TensorFlow en Keras geüpgraded met pip.
Bedankt voor alle hulp!


Antwoord 1, Autoriteit 100%

Mijn probleem gebruikte ‘+’ in plaats van ‘toe te voegen’ op Keras


Antwoord 2, Autoriteit 57%

Omdat de fout vanaf hier rechtstreeks komt:

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)

, en de ingangen van uw modellen zijn afhankelijk van de uitgangen van eerdere modellen, ik geloof dat de bug in de codes in uw model ligt.

In uw modelcode, controleer regel op regel of u een niet-keras-bediening toepast, vooral in de laatste paar regels. Voor element-wise toevoeging kunt u bijvoorbeeld intuïtief gebruiken +of zelfs numpy.add, maar keras.layers.Add()zou moeten in plaats daarvan worden gebruikt.


Antwoord 3, Autoriteit 17%

@ ‘Maëva lc’: ik kan geen commentaar plaatsen, dit beantwoordt je Noneprobleem.

Maar de code werkt prima zonder de lijn

model1_out = (lambda x: K.round(x), output_shape=...)(model1_out)

en niet iets anders. Hoe dan ook, bedankt voor het proberen.

Functie round()is niet differentieerbaar, vandaar dat de gradiënt geen is. Ik stel voor dat u gewoon de lijn verwijdert.


Antwoord 4, Autoriteit 4%

Probeer dit:

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

Antwoord 5

Dit wordt ondersteund in TensorFlow-versies 1.x
U gebruikt versie 2.x waarschijnlijk.

% TensorFlow_version 1.x
Gebruik de bovenstaande TensorFlow_Version-magie voordat u TensorFlow importeert in Google Colab.

Dit is niet geldig in Jupyter-Notebook. Gebruik Google Colab

Other episodes