在将使用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_train,Y_train,X_val,Y_val都是(num_slices, img_width, img_height, num_channels)形状的
我一直遇到的错误如下:
回溯(最近一次调用): 文件"TrainNetwork_CNTK.py",第188行,在 历史= 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行,适配 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行,在call中 input_dict,self.trainer_output) 文件"C:\Users...\site-packages\cntk\train\trainer.py",第160行,在train_minibatch中 output_map,设备) 文件“C:\Users.\site-packages\cntk\cntk_py.py”,第2769行,在train_minibatch中 返回_cntk_py.Trainer_train_minibatch(self,*args) RuntimeError:节点'UserDefinedFunction2738‘(UserDefinedV2Function操作):TensorSliceWithMBLayoutFor: FrameRange的动态轴与数据不一致:
这里似乎很少有关于CNTK问题的活动,所以任何试图为这个问题发光的东西都会很有帮助!
发布于 2017-09-09 04:51:34
原因是损失函数:
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)https://stackoverflow.com/questions/45984253
复制相似问题