Python Keras:张量对象没有属性_keras“历史”;
前面问题的大多数答案都建议将有问题的张量包装在Python Keras:张量对象没有属性_keras“历史”;,python,tensorflow,keras,Python,Tensorflow,Keras,前面问题的大多数答案都建议将有问题的张量包装在Lambda层中。然而,我已经这样做了(并尝试了许多修改),它仍然抛出相同的错误。 当前模型定义的伪代码如下所示: #[为简单起见,此处未显示以前的模型定义层] out_持续时间=重塑((30,3))(out_持续时间) out_位置=重塑((30,3))(out_位置) low=tf.constant([(30x3)numpy数组的下限)])#不能在这里使用K.clip,因为每个元素的下限都不同 high=tf.常量([(30x3)numpy上界数
Lambda
层中。然而,我已经这样做了(并尝试了许多修改),它仍然抛出相同的错误。
当前模型定义的伪代码如下所示:
#[为简单起见,此处未显示以前的模型定义层]
out_持续时间=重塑((30,3))(out_持续时间)
out_位置=重塑((30,3))(out_位置)
low=tf.constant([(30x3)numpy数组的下限)])#不能在这里使用K.clip,因为每个元素的下限都不同
high=tf.常量([(30x3)numpy上界数组)])
裁剪出的位置=Lambda(Lambda x:tf.clip_by_value(*x),输出形状=裁剪出的位置。获取形状()。作为列表())([out_位置,低,高])
模型=模型(输入=x,输出=[输出持续时间,剪裁位置]
错误输出:
文件“multitask_inverter.py”,第107行,输入
main()
文件“multitask_inverter.py”,第75行,主目录
模型=模型(输入=x,输出=[输出持续时间,剪裁位置])
文件“/om/user/lnj/openmind_env/tensorflow gpu/lib/python3.5/site packages/keras/legacy/interfaces.py”,第88行,在包装器中
返回函数(*args,**kwargs)
文件“/om/user/lnj/openmind_env/tensorflow gpu/lib/python3.5/site packages/keras/engine/topology.py”,第1705行,在_init中__
构建图的图(x、完成的节点、进行中的节点)
文件“/om/user/lnj/openmind_env/tensorflow gpu/lib/python3.5/site packages/keras/engine/topology.py”,第1695行,内置图
层、节点索引、张量索引)
文件“/om/user/lnj/openmind_env/tensorflow gpu/lib/python3.5/site packages/keras/engine/topology.py”,第1665行,内置图
层,节点索引,张量索引=张量
AttributeError:“Tensor”对象没有属性“\u keras\u history”
您可以使用Lambda(…,参数={'low':low,'high':high})向层提供low
和high
。从Lambda
的文档中:
参数:要传递给的关键字参数的可选字典
功能
比如说,
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:没有为“lambda_1”提供数据。需要每个输入的数据:['out\u duration','lambda\u 1']
--我不完全确定这里发生了什么。我想你需要发布更多的代码。新问题并非来自您发布的代码。您的模型看起来怎么样?您如何调用fit()
?我已经添加了一个关于如何使用这一行的示例网络。你能把它和你的网络比较一下,看看是否有什么不同吗?在我看来,您的错误与原来的问题不同,因为它是由fit()
引发的错误,而不是模型构造。太棒了,它可以工作!你能解释一下为什么添加参数
param是解决这个问题的正确方法吗?我认为这是因为低
和高
不是Keras张量。Keras张量在\u Keras\u history
中记录一些拓扑信息。当在模型构建过程中找不到信息时,您将看到类似这样的错误。要将不是Keras层输出的内容传递给Lambda
层,可以使用arguments
参数。