gpt4 book ai didi

python - 用于编译网络 (CNN) 的 Keras 自定义损失函数中出现错误

转载 作者:行者123 更新时间:2023-12-01 06:43:06 24 4
gpt4 key购买 nike

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

1-首先,我需要知道优化器正在考虑哪个样本,以便我可以读取该样本的内容并计算 Dice,而基于自定义损失函数中仅定义了 y_true 和 y_pred关于 Keras 文档。

2-我编写以下代码作为我的损失函数:1)首先,扭曲第一个图像,2)其次,将两个图像二进制化(每个样本由 2 个图像组成:一个是移动图像,另一个是固定图像)图像),3)第三,返回图像对(扭曲和固定)之间的 Dice 系数。

由于自定义损失函数的参数仅限于 y_true 和 y_pred,并且所考虑的样本没有索引,并且我的问题是无监督的(即不需要任何标签),因此我使用了样本的索引馈送到CNN作为标签,并尝试使用y_true[0]作为CNN考虑的训练样本的索引,并将batch-size设置为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 后端重写我自己的损失函数,但我需要 Numpy 和 SciPy,无法跳入这种低级编程,因为我完成项目的时间非常有限。

主要问题是 y_true 为空(它只是一个占位符,而不是具有值的实际变量),并且不能用作 Train_DataCT[y_true[0]] 的索引,因为错误是:索引应该是整数, :, bool 值等等以及张量不能用作索引!我尝试了多种方法,例如将 y_true 转换为 ndarray 或使用 y_true.eval() 来初始化它,但我得到了错误: session 错误,没有默认 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
<小时/>

最佳答案

您的损失函数应该适用于您后端的张量类型。如果您使用带有 tf 后端的 keras,以下函数可能有助于组合高级 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?

关于python - 用于编译网络 (CNN) 的 Keras 自定义损失函数中出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59358813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com