编译网络(CNN)的Keras自定义丢失函数出错

2024-06-03 17:06:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在Keras中定义自定义损失函数以编译CNN网络时,我有两个主要问题。我正在通过CNN进行2D图像配准(将一对2D图像对齐以使彼此最佳匹配)。作为网络的预测,网络的输出将是一个5维浮点型数组。(1缩放,2平移和2缩放x和y)。对于配准问题,有两个主要的损失函数(以及度量),称为Dice系数和TRE(目标配准误差,即医生标记的一对标志点之间的距离之和)。顺便说一下,我需要实现这两个损失函数。对于骰子系数:

1-首先,我需要知道优化器正在考虑哪个样本,这样我就可以读取该样本的内容并计算骰子,而基于Keras文档的定制损失函数中只定义了yu true和yu pred。你知道吗

2-我写了以下代码作为我的损失函数1)第一,扭曲第一个图像,2)第二,使两个图像二值化(每个样本由两个图像组成:一个是运动图像,另一个是固定图像),3)第三,返回两个图像之间的骰子系数(扭曲和固定)。你知道吗

由于自定义损失函数的参数被限制为y\u true和y\u pred,并且考虑中的样本没有索引,我的问题是无监督的(即不需要任何标签),所以我使用反馈给CNN的样本索引作为标签,在CNN的考虑下,尝试用yu-true[0]作为训练样本的指标,并将批量大小设置为1。你知道吗

def my_loss_f(y_true,y_pred):
    from scipy.spatial import distance as dis
    a = y_true[0]
    nimg1=warping(Train_DataCT[a],y_pred) # line 83 in CNN1.py
    return dis.dice(BW(nimg1).flatten(),BW(Train_DataMR[a]).flatten())

def warping(nimg,x):
    import scipy.ndimage as ndi
    nimg1 = ndi.rotate(nimg, x[0], reshape=False)
    nimg1 = ndi.shift(nimg1, [x[1], x[2]])
    nimg1 = clipped_zoom(nimg1, [x[3], x[4]])
    return nimg1

def BW(nimg1):
    hist = ndi.histogram(nimg1, 0, 255, 255)
    som = ndi.center_of_mass(hist)
    bwnimg = np.where(nimg1 > som, 1, 0)
    return bwnimg

但是,我经常会遇到如下不同的错误。有人告诉我使用TensorFlow或Keras后端重写我自己的loss函数,但我需要Numpy和SciPy,不能跳进这种低级编程,因为我完成项目的时间非常有限。你知道吗

主要问题是y\u true为空(它只是一个占位符而不是有值的实数变量),不能用作Train\u DataCT[y\u true[0]]的索引,因为错误是:索引应该是整数、:、布尔等,张量不能用作索引!我尝试了很多方法,例如将y d u true转换为ndarray或使用y_正确。评估()初始化它,但我得到了错误:Session error,no default Session。你知道吗

谢谢,请有人帮帮我。你知道吗


Traceback (most recent call last):
  File "D:/Python/Reg/Deep/CNN1.py", line 83, in <module>
    model.compile(optimizer='rmsprop',loss=my_loss_f)
  File "C:\Users\Hamidreza\Anaconda3\lib\site-packages\keras\engine\training.py", line 342, in compile
    sample_weight, mask)
  File "C:\Users\Hamidreza\Anaconda3\lib\site-packages\keras\engine\training_utils.py", line 404, in weighted
    score_array = fn(y_true, y_pred)
  File "D:/Python/Reg/Deep/CNN1.py", line 68, in my_loss_f
    nimg1=warping(Train_DataCT[1],y_pred)
  File "D:/Python/Reg/Deep/CNN1.py", line 55, in warping
    nimg1 = ndi.rotate(nimg, x[0], reshape=False)
  File "C:\Users\Hamidreza\Anaconda3\lib\site-packages\scipy\ndimage\interpolation.py", line 703, in rotate
    m11 = math.cos(angle)
TypeError: must be real number, not Tensor

Process finished with exit code 1


Tags: 函数inpy图像truelinecnnndi
2条回答

让我细化我的问题:我需要我输入的样本数据来计算损失函数。有/没有批处理,我应该知道CNN考虑的样本的索引,以便计算损失,例如一对输入图像之间的骰子系数。你知道吗

由于我的问题是无监督学习,作为一种替代解决方案,我使用y d u true作为样本的索引,但是当例如tf.压扁,我使用了y\u true[0],比如Train\u DataCT[y\u true[0]],我得到了一个错误:索引不能是张量!你知道吗

如何在自定义的loss函数中使用.run()或.eval(),以便y\u true获得值,以便将其转换为例如ndarray???你知道吗

你的损失函数应该适用于你的张量类型。如果您将keras与tf backend一起使用,以下函数可能有助于将高级numpy/scipy函数和张量结合起来:

https://www.tensorflow.org/api_docs/python/tf/numpy_function?version=stable

此外,在以下内容中,您可以找到更多关于此的有用信息:

How to make a custom activation function with only Python in Tensorflow?

相关问题 更多 >