【问题标题】:Keras: Tensor object has no attribute "_keras_history"Keras:张量对象没有属性“_keras_history”
【发布时间】:2018-07-26 23:57:03
【问题描述】:

similar 先前问题的大多数答案都建议将有问题的张量包装在 Lambda 层中。但是,我已经这样做了(并尝试了修复的许多变体),它仍然抛出相同的错误。 我当前模型定义的伪代码如下所示:

# [previous layers of model definition not shown here for simplicity]
out_duration = Reshape((30, 3))(out_duration)
out_position = Reshape((30, 3))(out_position)
low = tf.constant([(30x3) numpy array of lower bounds)]) # can't use K.clip here because the lower bound is different for every element
high = tf.constant([(30x3) numpy array of upper bounds)])
clipped_out_position = Lambda(lambda x: tf.clip_by_value(*x), output_shape=out_position.get_shape().as_list())([out_position, low, high])
model = Model(inputs=x, outputs=[out_duration, clipped_out_position]

错误输出:

   File "multitask_inverter.py", line 107, in <module>
    main()
  File "multitask_inverter.py", line 75, in main
    model = Model(inputs=x, outputs=[out_duration, clipped_out_position])
  File "/om/user/lnj/openmind_env/tensorflow-gpu/lib/python3.5/site-packages/keras/legacy/interfaces.py", line 88, in wrapper
    return func(*args, **kwargs)
  File "/om/user/lnj/openmind_env/tensorflow-gpu/lib/python3.5/site-packages/keras/engine/topology.py", line 1705, in __init__
    build_map_of_graph(x, finished_nodes, nodes_in_progress)
  File "/om/user/lnj/openmind_env/tensorflow-gpu/lib/python3.5/site-packages/keras/engine/topology.py", line 1695, in build_map_of_graph
    layer, node_index, tensor_index)
  File "/om/user/lnj/openmind_env/tensorflow-gpu/lib/python3.5/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 tensorflow keras


    【解决方案1】:

    您可以将lowhigh 提供给具有Lambda(..., arguments={'low': low, 'high': high}) 的层。来自Lambda的文档:

    arguments:要传递给的关键字参数的可选字典 函数。

    例如,

    clipped_out_position = Lambda(lambda x, low, high: tf.clip_by_value(x, low, high),
                                  arguments={'low': low, 'high': high})(out_position)
    

    编辑:

    下面是测试这一层的更完整示例:

    x = Input(shape=(100,))
    out_duration = Dense(90)(x)
    out_position = Dense(90)(x)
    out_duration = Reshape((30, 3))(out_duration)
    out_position = Reshape((30, 3))(out_position)
    
    low = tf.constant(np.random.rand(30, 3).astype('float32'))
    high = tf.constant(1 + np.random.rand(30, 3).astype('float32'))
    clipped_out_position = Lambda(lambda x, low, high: tf.clip_by_value(x, low, high),
                                  arguments={'low': low, 'high': high})(out_position)
    
    model = Model(inputs=x, outputs=[out_duration, clipped_out_position])
    model.compile(loss='mse', optimizer='adam')
    model.fit(np.random.rand(5000, 100), [np.random.rand(5000, 30, 3), np.random.rand(5000, 30, 3)])
    

    【讨论】:

    • 这导致ValueError: No data provided for "lambda_1". Need data for each key in: ['out_duration', 'lambda_1'] -- 我不完全确定这里发生了什么。
    • 我认为您需要发布更多代码。新问题并非来自您发布的代码。你的模型是什么样子的?你怎么称呼fit()
    • 我添加了一个关于如何使用这条线的示例网络。您可以将其与您的网络进行比较并检查是否有任何区别吗?在我看来,您的错误与原来的问题不同,因为它是从fit() 引发的错误,而不是模型构造。
    • 太棒了,它有效!你能解释一下为什么添加 arguments 参数是解决这种情况的正确方法吗?
    • 我认为这是因为 lowhigh 不是 Keras 张量。一个 Keras 张量在_keras_history 中记录了一些拓扑信息。在模型构建过程中找不到信息时,您会看到类似的错误。要将不是 Keras 层输出的内容传递给Lambda 层,可以使用arguments 参数。
    猜你喜欢
    • 2019-03-08
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2019-08-11
    • 2019-07-03
    • 2020-10-22
    相关资源
    最近更新 更多