我想做一个自定义的损失函数。具体来说,我在 Keras 中使用了 2D 卷积神经网络。到目前为止,我已经通过添加 loss.py 来制作各种自定义损失函数。但是,在这种情况下,我遇到了稍后解释的问题。
我试图为图像任务制作回归器。输入和输出的数据形状都是 (1,128,128,2),其中 1 是 mini-batch 大小,128 是像素数,2 是通道数。
无论如何,我想为这个任务添加新的损失函数。我想计算答案和预测值之间的像素梯度差异并添加到损失函数中。我试着像下面这样。
def continuity(y_true, y_pred):
import tensorflow as tf
import numpy as np
dx = dy = 1/128
gridSetting = (128,128)
u_true = y_true[0,:,:,0]
v_true = y_true[0,:,:,1]
u_pred = y_pred[0,:,:,0]
v_pred = y_pred[0,:,:,1]
cont_true = np.zeros((127,127))
for j in range(127):
for i in range(127):
cont_true[i,j] = (u_true[i+1,j]-u_true[i,j])/dx + (v_true[i,j+1]-v_true[i,j])/dy
cont_pred = np.zeros((127,127))
for j in range(127):
for i in range(127):
cont_pred[i,j] = (u_pred[i+1,j]-u_pred[i,j])/dx + (v_pred[i,j+1]-v_pred[i,j])/dy
cont_true = K.variable(value=cont_true, dtype='float64')
cont_pred = K.variable(value=cont_pred, dtype='float64')
cont = K.mean(K.abs(cont_true - cont_pred), axis=-1)
mse = K.mean(K.square(y_pred - y_true), axis=-1)
cont_mse = cont+mse
return cont_mse
错误写如下。
Traceback (most recent call last):
File "DSC_multi-scale_2D.py", line 107, in <module>
autoencoder.compile(optimizer='adam', loss='continuity')
File "/home/----/anaconda3/envs/tensorflow-only/lib/python3.6/site-packages/keras/engine/training.py", line 332, in compile
sample_weight, mask)
File "/home/----/anaconda3/envs/tensorflow-only/lib/python3.6/site-packages/keras/engine/training_utils.py", line 403, in weighted
score_array = fn(y_true, y_pred)
File "/home/----/anaconda3/envs/tensorflow-only/lib/python3.6/site-packages/keras/losses.py", line 86, in continuity
cont_true[i,j] = (u_true[i+1,j]-u_true[i,j])/dx + (v_true[i,j+1]-v_true[i,j])/dy
ValueError: setting an array element with a sequence.
可能在 loss.py 中,数据类型u_true, v_true... 不支持 numpy。
如何调试/修复此问题?