属性错误:'Tensor'对象没有属性'_keras_history'。

20

我查看了所有 "'Tensor' object has no attribute ***" 的相关内容,但似乎都与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]                    
_____________________________________________________________________________

我预训练了模型 2 和模型 3。问题在于我用由 0 和 1 组成的列表预训练了模型 2,但是模型 1 返回的是接近的值。所以我考虑使用以下代码对模型1的输出进行四舍五入:在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'

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


2
尝试将K.round放在Lambda层内。在keras中,很少看到层外的操作。(虽然不确定这是否是问题所在)。 - Daniel Möller
1
@Daniel:使用rounded = Lambda(lambda x: K.round(x))(G_out)F_out = F([GAN_in, rounded]),我可以“编译”但不能再“拟合”了。 - Maëva LC
1
请注意,TensorFlow仅支持Windows上Python 3.5.x版本:https://www.tensorflow.org/install/install_windows - desertnaut
1
@MaëvaLC,除了这段附加的代码外,你的代码中是否使用了 + 运算符? - Green Falcon
1
我之所以这么说是因为“+”运算符无法正常工作,您必须使用Keras的add方法。 - Green Falcon
显示剩余4条评论
6个回答

23

我的问题是在keras中使用'+'而不是'Add'


13

由于错误直接来自这里:

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()


2
我之前也遇到了同样的问题,但是现在已经解决了。我之前在代码中使用了"+"符号,直到我尝试创建模型时才出现错误。将"+"替换为keras的Add()函数后,问题得以解决。 - Eric Antoine Scuccimarra

4

@'Maëva LC': 我无法发表评论,这个回答解决了你的None问题。

但是没有这行代码也可以运行得很好

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

其他什么也没有。无论如何,谢谢你的尝试。

round()函数不可导,因此梯度为None。我建议你只是删除这一行。


1

试试这个:

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) 这一行,代码也可以正常运行,并且没有对其他部分进行任何修改。无论如何,还是感谢你的尝试。 - Maëva LC

0

这在tensorflow 1.x版本中得到支持,您可能正在使用2.x版本。

%tensorflow_version 1.x
在导入Google Colab中的tensorflow之前,请使用上述tensorflow_version魔法命令。

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


0

我也曾经遇到过同样的问题。当我使用 x = relu(x) 时,我得到了相同的错误。为了克服这个问题,我定义了一个函数并使用了 Lambda 层。

def relu_func(x):
  
    return relu(x)

    x = layers.Lambda(relu_func)(x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接