Keras自定义IOU方式
我就废话不多说了,大家还是直接看代码吧!
defiou(y_true,y_pred,label:int): """ ReturntheIntersectionoverUnion(IoU)foragivenlabel. Args: y_true:theexpectedyvaluesasaone-hot y_pred:thepredictedyvaluesasaone-hotorsoftmaxoutput label:thelabeltoreturntheIoUfor Returns: theIoUforthegivenlabel """ #extractthelabelvaluesusingtheargmaxoperatorthen #calculateequalityofthepredictionsandtruthstothelabel y_true=K.cast(K.equal(K.argmax(y_true),label),K.floatx()) y_pred=K.cast(K.equal(K.argmax(y_pred),label),K.floatx()) #calculatethe|intersection|(AND)ofthelabels intersection=K.sum(y_true*y_pred) #calculatethe|union|(OR)ofthelabels union=K.sum(y_true)+K.sum(y_pred)-intersection #avoiddividebyzero-iftheunioniszero,return1 #otherwise,returntheintersectionoverunion returnK.switch(K.equal(union,0),1.0,intersection/union) defmean_iou(y_true,y_pred): """ ReturntheIntersectionoverUnion(IoU)score. Args: y_true:theexpectedyvaluesasaone-hot y_pred:thepredictedyvaluesasaone-hotorsoftmaxoutput Returns: thescalarIoUvalue(meanoveralllabels) """ #getnumberoflabelstocalculateIoUfor num_labels=K.int_shape(y_pred)[-1]-1 #initializeavariabletostoretotalIoUin mean_iou=K.variable(0) #iterateoverlabelstocalculateIoUfor forlabelinrange(num_labels): mean_iou=mean_iou+iou(y_true,y_pred,label) #dividetotalIoUbynumberoflabelstogetmeanIoU returnmean_iou/num_labels
补充知识:keras自定义评估函数和损失函数loss训练模型后加载模型出现ValueError:Unknownmetricfunction:fbeta_score
keras自定义评估函数
有时候训练模型,现有的评估函数并不足以科学的评估模型的好坏,这时候就需要自定义一些评估函数,比如样本分布不均衡是准确率accuracy评估无法判定一个模型的好坏,这时候需要引入精确度和召回率作为评估标准,不幸的是keras没有这些评估函数。
以下是参考别的文章摘取的两个自定义评估函数
召回率:
defrecall(y_true,y_pred): true_positives=K.sum(K.round(K.clip(y_true*y_pred,0,1))) possible_positives=K.sum(K.round(K.clip(y_true,0,1))) recall=true_positives/(possible_positives+K.epsilon()) returnrecall
精确度:
defprecision(y_true,y_pred): true_positives=K.sum(K.round(K.clip(y_true*y_pred,0,1))) predicted_positives=K.sum(K.round(K.clip(y_pred,0,1))) precision=true_positives/(predicted_positives+K.epsilon()) returnprecision
自定义了评估函数,一般在编译模型阶段加入即可:
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy',precision,recall])
自定义了损失函数focal_loss一般也在编译阶段加入:
model.compile(optimizer=Adam(lr=0.0001),loss=[focal_loss],
metrics=['accuracy',fbeta_score],)
其他的没有特别要注意的点,直接按照原来的思路训练一版模型出来就好了,关键的地方在于加载模型这里,自定义的函数需要特殊的加载方式,不然会出现加载没有自定义函数的问题:ValueError:Unknownlossfunction:focal_loss
解决方案:
model_name='test_calssification_model.h5' model_dfcw=load_model(model_name, custom_objects={'focal_loss':focal_loss,'fbeta_score':fbeta_score})
注意点:将自定义的损失函数和评估函数都加入到custom_objects里,以上就是在自定义一个损失函数从编译模型阶段到加载模型阶段出现的所有的问题。
以上这篇Keras自定义IOU方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。