Keras + CNTK:TensorSliceWithMBLayoutFor

时间:2017-08-31 14:43:31

标签: keras cntk

在将使用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)

我不断得到的错误如下:

  

追踪(最近的呼叫最后):
   文件" TrainNetwork_CNTK.py",第188行,在       history = model.fit(X_train,Y_train,epochs = trainingEpochs,verbose = 2,shuffle = True,validation_data =(X_val,Y_val),callbacks = cb_list)
    文件" C:\ Users ... \ site-packages \ keras \ engine \ training.py",第1430行,in fit
      initial_epoch = initial_epoch)
    文件" C:\ Users ... \ site-packages \ keras \ engine \ training.py",第1079行,在_fit_loop中       outs = f(ins_batch)
    文件" C:\ Users ... \ site-packages \ keras \ backend \ cntk_backend.py",第1664行,致电
      input_dict,self.trainer_output)
    文件" C:\ Users ... \ site-packages \ cntk \ train \ trainer.py",第160行,在train_minibatch中       output_map,device)
    文件" C:\ Users ... \ site-packages \ cntk \ cntk_py.py",第2769行,在train_minibatch中       return _cntk_py.Trainer_train_minibatch(self,* args)
  RuntimeError:Node' UserDefinedFunction2738' (UserDefinedV2Function操作):TensorSliceWithMBLayoutFor:FrameRange的动态轴与数据不一致:

在这里,CNTK问题的活动似乎很少,所以任何尝试为这个问题发光的事情都会非常有用!

1 个答案:

答案 0 :(得分:1)

原因是损失函数:

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)