Python 为什么我的自定义丢失函数不接受转换的numpy数组?

Python 为什么我的自定义丢失函数不接受转换的numpy数组?,python,tensorflow,machine-learning,keras,loss-function,Python,Tensorflow,Machine Learning,Keras,Loss Function,我试图通过调用外部函数(不是使用keras/tensorflow后端函数编写的),编写一个自定义损失函数,该函数将在向前传球之后、向后支撑之前对NN输出进行操作。这个操作输出和理想输出之间的差异是我想要用于误差计算的 我有一个自定义的loss函数loss_function(y_true,y_pred),它使用tf.py_函数调用外部函数,将y_pred参数传递给函数 理想情况下,我希望将y_pred参数转换为numpy数组,将此数组与我的函数一起使用以返回另一个numpy数组,将此numpy数组

我试图通过调用外部函数(不是使用keras/tensorflow后端函数编写的),编写一个自定义损失函数,该函数将在向前传球之后、向后支撑之前对NN输出进行操作。这个操作输出和理想输出之间的差异是我想要用于误差计算的

我有一个自定义的loss函数loss_function(y_true,y_pred),它使用tf.py_函数调用外部函数,将y_pred参数传递给函数

理想情况下,我希望将y_pred参数转换为numpy数组,将此数组与我的函数一起使用以返回另一个numpy数组,将此numpy数组转换为tf张量,然后根据需要在loss函数中使用它

以下是自定义错误函数:

def loss_函数(y_true,y_pred):
y_pred2=tf.py_函数(func=SOA,inp=[y_pred],Tout=tf.float32)
返回tf.reduce_平均值(tf.pow(y_真-y_pred2,2))
这里是它调用的外部函数“SOA”,它只是将其转换为numpy数组,然后再转换回tf张量:


定义SOA(y_pred):
y_pred0=np.平方(np.副本(y_pred))
打印(类型(y_pred0))
y_pred1=tf。将_转换为_张量((y_pred0))
打印(类型(y_pred1))
返回y_pred1
我可以使用各种tf函数在外部函数中直接对y_pred进行操作,但如果我将其转换为numpy数组(例如,使用np.copy(…),然后使用tf.convert_to_张量将其转换回,则会出现以下错误:

InvalidArgumentError: In[0] is not a matrix
     [[{{node training_188/Adam/gradients/dense_299/MatMul_grad/MatMul}}]]
此外,如果使用y_true而不是y_pred,则会产生不同的错误:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

这对我来说似乎很奇怪,因为它似乎在区分完全相同类型的对象()。

您的帖子有点混乱,但根据
tf.py_func
的文档,您的函数
SOA
应该返回ndarray(这是numpy数组类型)而不是张量。因此,省略转换,看看这是否有帮助

试试这个:

def SOA(y_pred):

    y_pred0 = np.square(np.copy(y_pred))
    print(type(y_pred0))

    return y_pred0