keras自定义损失函数并且模型加载的写法介绍
keras自定义函数时候,正常在模型里自己写好自定义的函数,然后在模型编译的那行代码里写上接口即可。如下所示,focal_loss和fbeta_score是我们自己定义的两个函数,在model.compile加入它们,metrics里‘accuracy'是keras自带的度量函数。
deffocal_loss(): ... returnxx deffbeta_score(): ... returnyy model.compile(optimizer=Adam(lr=0.0001),loss=[focal_loss],metrics=['accuracy',fbeta_score])
训练好之后,模型加载也需要再额外加一行,通过load_model里的custom_objects将我们定义的两个函数以字典的形式加入就能正常加载模型啦。
weight_path='./weights.h5'
model=load_model(weight_path,custom_objects={'focal_loss':focal_loss,'fbeta_score':fbeta_score})
补充知识:keras如何使用自定义的loss及评价函数进行训练及预测
1.有时候训练模型,现有的损失及评估函数并不足以科学的训练评估模型,这时候就需要自定义一些损失评估函数,比如focalloss损失函数及dice评价函数forunet的训练。
2.在训练建模中导入自定义loss及评估函数。
#模型编译时加入自定义loss及评估函数 model.compile(optimizer=Adam(lr=1e-4),loss=[binary_focal_loss()], metrics=['accuracy',dice_coef]) #自定义loss及评估函数 defbinary_focal_loss(gamma=2,alpha=0.25): """ Binaryformoffocalloss. 适用于二分类问题的focalloss focal_loss(p_t)=-alpha_t*(1-p_t)**gamma*log(p_t) wherep=sigmoid(x),p_t=por1-pdependingonifthelabelis1or0,respectively. References: https://arxiv.org/pdf/1708.02002.pdf Usage: model.compile(loss=[binary_focal_loss(alpha=.25,gamma=2)],metrics=["accuracy"],optimizer=adam) """ alpha=tf.constant(alpha,dtype=tf.float32) gamma=tf.constant(gamma,dtype=tf.float32) defbinary_focal_loss_fixed(y_true,y_pred): """ y_trueshapeneedbe(None,1) y_predneedbecomputeaftersigmoid """ y_true=tf.cast(y_true,tf.float32) alpha_t=y_true*alpha+(K.ones_like(y_true)-y_true)*(1-alpha) p_t=y_true*y_pred+(K.ones_like(y_true)-y_true)*(K.ones_like(y_true)-y_pred)+K.epsilon() focal_loss=-alpha_t*K.pow((K.ones_like(y_true)-p_t),gamma)*K.log(p_t) returnK.mean(focal_loss) returnbinary_focal_loss_fixed #''' #smooth参数防止分母为0 defdice_coef(y_true,y_pred,smooth=1): intersection=K.sum(y_true*y_pred,axis=[1,2,3]) union=K.sum(y_true,axis=[1,2,3])+K.sum(y_pred,axis=[1,2,3]) returnK.mean((2.*intersection+smooth)/(union+smooth),axis=0)
注意在模型保存时,记录的loss函数名称:你猜是哪个
a:binary_focal_loss()
b:binary_focal_loss_fixed
3.模型预测时,也要加载自定义loss及评估函数,不然会报错。
该告诉上面的答案了,保存在模型中loss的名称为:binary_focal_loss_fixed,在模型预测时,定义custom_objects字典,key一定要与保存在模型中的名称一致,不然会找不到lossfunction。所以自定义函数时,尽量避免使用我这种函数嵌套的方式,免得带来一些意想不到的烦恼。
model=load_model('./unet_'+label+'_20.h5',custom_objects={'binary_focal_loss_fixed':binary_focal_loss(),'dice_coef':dice_coef})
以上这篇keras自定义损失函数并且模型加载的写法介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。