Keras“;形状必须具有相同的等级”;尝试使用其他张量切片张量时出错

Keras“;形状必须具有相同的等级”;尝试使用其他张量切片张量时出错,keras,Keras,在我提出的其他一些问题的基础上,我尝试定义一个自定义损失函数,它允许我使用另一个张量的内容对输入张量的内容进行切片: def内部损耗(z): y_pred=z[0] patch_x=z[1][0] patch_y=z[1][1] patch_true=y_pred[patch_y:patch_y+10,patch_x:patch_x+10,0] 返回0 originalInputs=输入(形状=(128、128、1)) featureInputs=Input(形状=(2,),dtype=“int

在我提出的其他一些问题的基础上,我尝试定义一个自定义损失函数,它允许我使用另一个张量的内容对输入张量的内容进行切片:

def内部损耗(z):
y_pred=z[0]
patch_x=z[1][0]
patch_y=z[1][1]
patch_true=y_pred[patch_y:patch_y+10,patch_x:patch_x+10,0]
返回0
originalInputs=输入(形状=(128、128、1))
featureInputs=Input(形状=(2,),dtype=“int64”)
原始输出=输入(形状=(128,128,1))
损耗=λ(内部损耗)([原始输出,特性输入])
外部模型=模型(输入=[原始输入,特征输入],输出=损耗)
我得到以下错误:

ValueError:形状的秩必须相等,但为1和0
将形状1与其他形状合并。对于输入形状为[2]、[2]、[1]的“lambda_3/跨步_切片_2/堆栈_1”(op:“Pack”)。

这里,
featureInputs
将由一对坐标组成,告诉我们从何处开始在
originalInputs
中对图像进行切片。您没有考虑到第一个维度表示批量大小的事实。要理解我的意思,请在
patch\u true
之前打印
y\u pred
patch\u x
patch\u y
内部
innerLoss
的形状。你会发现问题所在的。啊,我明白了。因此,我需要将
patch_x=z[1][0]
更改为
patch_x=z[1][0,0]
,对于
path_y
(对于批量大小1)也是如此。但现在我得到一个数据类型错误:
传递给参数“begin”的值的数据类型float32不在允许值列表中:int32,int64
。为什么会这样?我将
featureInputs
定义为具有类型
int32
…我不知道为什么将其转换为float。只需将它们转换回int:
patch_y=K.cast(patch_y,'int32')
patch_x=K.cast(patch_x,'int32)
K
是对Keras中后端的引用:
从Keras导入后端为K