【问题标题】:AttributeError: 'Tensor' object has no attribute '_keras_history'AttributeError:“张量”对象没有属性“_keras_history”
【发布时间】:2017-12-06 22:27:42
【问题描述】:

我查找了所有“'Tensor' 对象没有属性 ***”,但似乎都与 Keras 无关(TensorFlow: AttributeError: 'Tensor' object has no attribute 'log10' 没有帮助)...

我正在制作一种 GAN(生成对抗网络)。在这里你可以找到结构。

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

我预训练了 model_2 和 model_3。问题是我使用由 0 和 1 组成的列表对 model_2 进行了预训练,但 model_1 返回接近的值。所以我考虑使用以下代码对 model1_output 进行四舍五入:model1_out 上的 K.round()。

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
[...]

我有以下错误:

AttributeError: 'Tensor' 对象没有属性 '_keras_history'

完整的追溯:

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'

我在 Windows 7 上使用 Python 3.6 和 Spyder 3.1.4。上周我用 pip 升级了 TensorFlow 和 Keras。 感谢您提供的任何帮助!

【问题讨论】:

  • 尝试将K.round 放入Lambda 层。在 keras 中看到层外的操作并不常见。 (但不确定这是不是问题所在)。
  • @Daniel:有了rounded = Lambda(lambda x: K.round(x))(G_out)F_out = F([GAN_in, rounded]),我可以“编译”但不再“适合”了。
  • 请记住,TensorFlow 在 Windows 上仅支持 Python 3.5.x 版本:tensorflow.org/install/install_windows
  • @MaëvaLC 除了这个附加代码之外,您是否在代码中使用 + 运算符?
  • 我说是因为 + 运算符不能正常工作,你必须使用 keras insead 的 add 方法

标签: python keras attributeerror


【解决方案1】:

我的问题是在 keras 上使用“+”而不是“添加”

【讨论】:

    【解决方案2】:

    由于错误直接来自这里:

    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)
    

    ,并且您的模型的输入取决于以前模型的输出,我相信错误在于您模型中的代码。

    在您的模型代码中,请逐行检查您是否应用了非 Keras 操作,尤其是最后几行。例如,对于元素相加,您可能直观地使用+ 甚至numpy.add,但应该使用keras.layers.Add()

    【讨论】:

    • 我遇到了同样的问题,这解决了。我之前在代码中使用了“+”,在我尝试创建模型之前它没有抛出错误。用 keras 的 Add() 替换“+”解决了这个问题。
    【解决方案3】:

    @'Maëva LC':我不能发表评论,这回答了你的None 问题。

    但代码在没有这条线的情况下工作正常

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

    而不是其他任何东西。无论如何,谢谢你的尝试。

    函数round() 不可微,因此梯度为无。我建议您删除该行。

    【讨论】:

      【解决方案4】:

      试试这个:

      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
      

      【讨论】:

      • 但代码在没有model1_out = Lambda(lambda x: K.round(x), output_shape=...)(model1_out) 行的情况下运行良好,并且没有触及其他任何东西。无论如何,谢谢你的尝试。
      【解决方案5】:

      这在 tensorflow 版本 1.x 中受支持 您可能使用的是 2.x 版本。

      %tensorflow_version 1.x
      在 google colab 中导入 tensorflow 之前,请使用上述 tensorflow_version 魔法。

      这在 jupyter-notebook 中无效。请务必使用 Google Colab

      【讨论】:

        猜你喜欢
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 2020-10-22
        • 2019-02-20
        • 2018-07-02
        相关资源
        最近更新 更多