在将使用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行,在 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问题的活动似乎很少,所以任何尝试为这个问题发光的事情都会非常有用!
答案 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)