Keras + CNTK:TensorSliceWithMBLayoutFor

Keras + CNTK: TensorSliceWithMBLayoutFor

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

该模型的灵感来自 https://github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.py

模型输入定义为 inputs = Input((img_width, img_height, num_channels)),其中 num_channels = 1

错误来自试图拟合模型的行: model.fit(X_train, Y_train, epochs=trainingEpochs, verbose=2, shuffle=True, validation_data=(X_val, Y_val), callbacks=cb_list)

其中X_trainY_trainX_valY_val的形状都是(num_slices, img_width, img_height, num_channels)

我不断收到的错误如下:

Traceback (most recent call last):
File "TrainNetwork_CNTK.py", line 188, in
history = model.fit(X_train, Y_train, epochs=trainingEpochs, verbose=2, shuffle=True, validation_data=(X_val, Y_val), callbacks=cb_list)
File "C:\Users...\site-packages\keras\engine\training.py", line 1430, in fit
initial_epoch=initial_epoch)
File "C:\Users...\site-packages\keras\engine\training.py", line 1079, in _fit_loop
outs = f(ins_batch)
File "C:\Users...\site-packages\keras\backend\cntk_backend.py", line 1664, in call
input_dict, self.trainer_output)
File "C:\Users...\site-packages\cntk\train\trainer.py", line 160, in train_minibatch
output_map, device)
File "C:\Users...\site-packages\cntk\cntk_py.py", line 2769, in train_minibatch
return _cntk_py.Trainer_train_minibatch(self, *args)
RuntimeError: Node 'UserDefinedFunction2738' (UserDefinedV2Function operation): TensorSliceWithMBLayoutFor: FrameRange's dynamic axis is inconsistent with data:

SO 中关于 CNTK 问题的内容似乎很少activity,所以任何试图阐明这个问题的东西都会非常有帮助!

原因是损失函数:

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) 时,它将对所有轴应用缩减和以获得比例,我们应该得到相同的结果而不展平它。我尝试了下面的损失函数,它似乎有效:

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)