Keras 建立自定义损失函数时出错

Keras 建立自定义损失函数时出错,keras,loss-function,Keras,Loss Function,我尝试建立我自己的损失函数,如下所示 将numpy导入为np 从keras导入后端为K def MyLoss(自我、x_输入、x_重构): a=np.复制(x_) a=np.asarray(a,dtype='float16') a=np.楼层(4*a)/4 返回K.mean(K.square(a-x_输入),轴=-1)` 在汇编中,它说 ValueError:使用序列设置数组元素 x_输入和x_重构都是[m,n,1]np数组。最后一行代码实际上是直接从Keras的内置MSE损耗函数复制的 另外

我尝试建立我自己的损失函数,如下所示

将numpy导入为np
从keras导入后端为K
def MyLoss(自我、x_输入、x_重构):
a=np.复制(x_)
a=np.asarray(a,dtype='float16')
a=np.楼层(4*a)/4
返回K.mean(K.square(a-x_输入),轴=-1)`
在汇编中,它说 ValueError:使用序列设置数组元素

x_输入和x_重构都是[m,n,1]np数组。最后一行代码实际上是直接从Keras的内置MSE损耗函数复制的

另外,我想损失是按每个样品计算的。如果输入和重构输入的尺寸均为[m,n,1],Keras的内置损耗结果也将为矩阵大小[m,n]。那么为什么它能正常工作呢

然后我试着直接用

def MyLoss(self,x_输入,x_重构):
a=np.复制(x_)
a=np.asarray(a,dtype=self.precision)
a=np.楼层(4*a)/4
Diff=a-x_输入
xx=np.平均值(np.平方(差异),轴=-1)
yy=np.和(xx)
返回yy
但错误依然存在。我犯了什么错误?该如何编写代码

借用了别人的建议,我试着照做

def MyLoss(self,x_输入,x_重构):
如果self.precision==“float16”:
K.set_floatx(‘float16’)
K.set_ε(1e-4)
a=K.cast_至_浮动x(x_输入)
a=K圆(a*4-0.5)/4.0
返回K.sum(K.mean(K.square(x_输入-a),轴=-1))

但是同样的错误也会发生

您不能在丢失中使用
numpy
数组。您必须使用
TensorFlow
Keras
后端操作。试试这个,也许:

import tensorflow as tf
import keras.backend as K

def MyLoss(x_input, x_reconstruct):
    a = tf.cast(x_input, dtype='tf.float16')       
    a = tf.floor(4*a)/4
    return K.mean(K.square(a - x_input), axis=-1)

您不能在丢失中使用
numpy
数组。您必须使用
TensorFlow
Keras
后端操作。试试这个,也许:

import tensorflow as tf
import keras.backend as K

def MyLoss(x_input, x_reconstruct):
    a = tf.cast(x_input, dtype='tf.float16')       
    a = tf.floor(4*a)/4
    return K.mean(K.square(a - x_input), axis=-1)

我自己找到了答案,让我在这里分享

如果我写这样的代码

def MyLoss(self,y_true,y_pred):
如果self.precision==“float16”:
K.set_floatx(‘float16’)
K.set_ε(1e-4)
返回K.均值(K.平方(y_真-K.圆(y_pred*4.-0.5)/4.0),轴=-1)

它起作用了。我认为,诀窍在于我不能使用“K.cast\u to\u floatx(y\u true)”。相反,只需直接使用y_true。我仍然不明白为什么…

我自己找到了答案,让我在这里分享

如果我写这样的代码

def MyLoss(self,y_true,y_pred):
如果self.precision==“float16”:
K.set_floatx(‘float16’)
K.set_ε(1e-4)
返回K.均值(K.平方(y_真-K.圆(y_pred*4.-0.5)/4.0),轴=-1)

它起作用了。我认为,诀窍在于我不能使用“K.cast\u to\u floatx(y\u true)”。相反,只需直接使用y_true。我仍然不明白为什么…

有两个建议可以帮助调试这个问题:1)在返回语句前面插入一行,
print(“got here”)
,这样您就可以验证问题是否与最后一行的计算有关;2) 输出x_input.shape和a.shape以查看它们是否兼容。恐怕无法工作。当我调用
model.compile(loss=self.MyLoss,optimizer=CurOptimizer,metrics=CurMetrics)
时,错误甚至在代码到达那里之前就发生了。有两个建议可以帮助调试这个问题:1)在返回语句
print(“got here”)
之前插入一行,这样你就可以验证问题出在最后一行的计算上;2) 输出x_input.shape和a.shape以查看它们是否兼容。恐怕无法工作。当我调用
model.compile(loss=self.MyLoss,optimizer=CurOptimizer,metrics=CurMetrics)