Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 在自定义keras损失中使用keras模型_Tensorflow_Keras_Predict_Loss Function - Fatal编程技术网

Tensorflow 在自定义keras损失中使用keras模型

Tensorflow 在自定义keras损失中使用keras模型,tensorflow,keras,predict,loss-function,Tensorflow,Keras,Predict,Loss Function,我有一个名为e的常规keras模型,我想在我的自定义损失函数中比较y_pred和y_true的输出 from keras import backend as K def custom_loss(y_true, y_pred): return K.mean(K.square(e.predict(y_pred)-e.predict(y_true)), axis=-1) 我收到错误:AttributeError:'Tensor'对象没有属性“ndim” 这是因为y\u true和y\u pr

我有一个名为
e
的常规keras模型,我想在我的自定义损失函数中比较
y_pred
y_true
的输出

from keras import backend as K
def custom_loss(y_true, y_pred):
    return K.mean(K.square(e.predict(y_pred)-e.predict(y_true)), axis=-1)
我收到错误:
AttributeError:'Tensor'对象没有属性“ndim”
这是因为
y\u true
y\u pred
都是张量对象和
keras.model.predict
期望传递一个
numpy.array

你知道我如何在自定义损耗函数中成功使用我的
keras.model


如果需要,我愿意获取指定层的输出,或者将我的
keras.model
转换为
tf.estimator
对象(或任何其他对象)。

首先,让我们试着理解您得到的错误消息:

AttributeError:“Tensor”对象没有属性“ndim”

让我们看看Keras文档,并找到Keras模型的方法。我们可以看到功能参数的描述:

x:输入数据,作为Numpy数组

因此,模型试图获取
numpy数组的
ndims
属性,因为它需要一个数组作为输入。另一方面,Keras框架的自定义损失函数将
张量
作为输入。所以,不要在它里面写任何python代码——它在求值过程中永远不会被执行。调用此函数只是为了构造计算图


好了,现在我们发现了错误消息背后的含义,我们如何在自定义损失函数中使用Keras模型?简单!我们只需要得到模型的评估图

更新 使用
global
关键字是一种糟糕的编码实践。而且,现在到2020年,我们有了更好的Keras,这使得使用层的黑客不再必要。最好使用这样的方法:

从keras导入后端为K
def make_custom_损耗(型号):
“”“创建一个使用'model'进行计算的损失函数。”
"""
def自定义损耗(y_真,y_pred):
返回K.均值(K.平方(模型(y_pred)-模型(y_true)),轴=-1)
退还海关损失
定制损耗=定制损耗(e)

不赞成 尝试类似的方法(仅适用于
顺序
模型和非常旧的API):

def自定义丢失(y_真,y_pred):
#您的模型存在于全局范围内
全球电子商务
#获取模型的层
层=[l代表e层中的l]
#在y_pred上构建一个图来评估您的其他模型
eval_pred=y_pred
对于范围内的i(len(层)):
eval_pred=层[i](eval_pred)
#在y_true上构建一个图来评估其他模型
eval_true=y_true
对于范围内的i(len(层)):
eval_true=层[i](eval_true)
#现在,对输出执行您想要执行的操作。
#请注意,我们返回的不是值,而是张量。
返回K.均值(K.平方(eval_pred-eval_true),轴=-1)
请注意,上面的代码没有经过测试。但是,无论实现如何,总体思路都将保持不变:您需要构建一个图,其中
y\u true
y\u pred
将通过它流向最终操作