Keras+;CNTK:带MBlayoutFor的张量许可证

Keras+;CNTK:带MBlayoutFor的张量许可证,keras,cntk,Keras,Cntk,在将使用Keras+Tensorflow后端完成的图像分割代码迁移到Keras+CNTK后端时,我遇到了一些问题。该代码在TF后端上运行良好,但在CNTK上崩溃 该模型的灵感来自 模型输入定义为输入=输入((img\u宽度、img\u高度、数量通道)),其中数量通道=1 错误来自尝试拟合模型的行: model.fit(X\u-train,Y\u-train,epochs=trainingEpochs,verbose=2,shuffle=True,validation\u-data=(X\u-va

在将使用Keras+Tensorflow后端完成的图像分割代码迁移到Keras+CNTK后端时,我遇到了一些问题。该代码在TF后端上运行良好,但在CNTK上崩溃

该模型的灵感来自

模型输入定义为
输入=输入((img\u宽度、img\u高度、数量通道))
,其中
数量通道=1

错误来自尝试拟合模型的行:
model.fit(X\u-train,Y\u-train,epochs=trainingEpochs,verbose=2,shuffle=True,validation\u-data=(X\u-val,Y\u-val),callbacks=cb\u-list)

其中
X\u-train
Y\u-train
X\u-val
Y\u-val
都是形状
(num\u切片,img\u宽度,img\u高度,num\u通道)

我一直得到的错误如下:

回溯(最近一次呼叫最后一次):
文件“TrainNetwork_CNTK.py”,第188行,在
历史=model.fit(X\u序列,Y\u序列,epochs=trainingEpochs,verbose=2,shuffle=True,validation\u data=(X\u val,Y\u val),callbacks=cb\u list)
文件“C:\Users…\site packages\keras\engine\training.py”,第1430行,适合
初始纪元=初始纪元)
文件“C:\Users…\site packages\keras\engine\training.py”,第1079行,在\u fit\u循环中
outs=f(ins\U批量)
文件“C:\Users…\site packages\keras\backend\cntk\u backend.py”,第1664行,在调用中 输入(指令、自培训师输出)
文件“C:\Users…\site packages\cntk\train\trainer.py”,第160行,在train\u minibatch中
输出(地图、设备)
文件“C:\Users…\site packages\cntk\cntk\u py.py”,第2769行,在列\u minibatch中
return\u cntk\u py.Trainer\u train\u minibatch(self,*args)
运行时错误:节点“UserDefinedFunction2738”(UserDefinedV2Function操作):TensorSliceWithMBLayoutFor:FrameRange的动态轴与数据不一致:


在这里,似乎很少有关于CNTK问题的活动,所以任何试图揭示这个问题的东西都会非常有帮助

原因是损失函数:

def dice_coef(y_true, y_pred):
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
cntk_keras的展平实现存在一个已知问题,这导致批次轴形状与此情况不匹配。不幸的是,我没有机会修复它:(

但对于您的情况,我认为我们不需要在这里进行展平,对吗?因为您正在使用带有默认轴选项的K.sum(x),该选项将对所有轴应用reduce sum以获得一个比例,我们应该在不展平的情况下获得相同的结果。我尝试了下面的损失函数,它似乎有效:

def dice_coef(y_true, y_pred):
    intersection = K.sum(y_true * y_pred)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)

很抱歉,回复太晚,整个月都在从一个项目转移过来。我最近尝试了你的建议,一切似乎都很好。不过,是否打算在以后的版本中修复此错误?我将CNTK升级到了2.2版,我在扁平化实现中遇到了同样的问题。