歡迎您光臨本站 註冊首頁

Keras自定義IOU方式

←手機掃碼閱讀     retouched @ 2020-06-12 , reply:0

我就廢話不多說了,大家還是直接看代碼吧!

  def iou(y_true, y_pred, label: int):    """    Return the Intersection over Union (IoU) for a given label.    Args:      y_true: the expected y values as a one-hot      y_pred: the predicted y values as a one-hot or softmax output      label: the label to return the IoU for    Returns:      the IoU for the given label    """    # extract the label values using the argmax operator then    # calculate equality of the predictions and truths to the label    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())    # calculate the |intersection| (AND) of the labels    intersection = K.sum(y_true * y_pred)    # calculate the |union| (OR) of the labels    union = K.sum(y_true) + K.sum(y_pred) - intersection    # avoid divide by zero - if the union is zero, return 1    # otherwise, return the intersection over union    return K.switch(K.equal(union, 0), 1.0, intersection / union)     def mean_iou(y_true, y_pred):    """    Return the Intersection over Union (IoU) score.    Args:      y_true: the expected y values as a one-hot      y_pred: the predicted y values as a one-hot or softmax output    Returns:      the scalar IoU value (mean over all labels)    """    # get number of labels to calculate IoU for    num_labels = K.int_shape(y_pred)[-1] - 1    # initialize a variable to store total IoU in    mean_iou = K.variable(0)        # iterate over labels to calculate IoU for    for label in range(num_labels):      mean_iou = mean_iou + iou(y_true, y_pred, label)          # divide total IoU by number of labels to get mean IoU    return mean_iou / num_labels

 

補充知識:keras 自定義評估函數和損失函數loss訓練模型後加載模型出現ValueError: Unknown metric function:fbeta_score

keras自定義評估函數

有時候訓練模型,現有的評估函數並不足以科學的評估模型的好壞,這時候就需要自定義一些評估函數,比如樣本分佈不均衡是準確率accuracy評估無法判定一個模型的好壞,這時候需要引入精確度和召回率作為評估標準,不幸的是keras沒有這些評估函數。

以下是參考別的文章摘取的兩個自定義評估函數

召回率:

  def recall(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())    return recall

 

精確度:

  def precision(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())    return precision

 

自定義了評估函數,一般在編譯模型階段加入即可:

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: Unknown loss function: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裡,以上就是在自定義一個損失函數從編譯模型階段到加載模型階段出現的所有的問題。

 

   


[retouched ] Keras自定義IOU方式已經有283次圍觀

http://coctec.com/docs/python/shhow-post-238150.html