日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tensorlfow2.0 二分类和多分类focal loss实现和在文本分类任务效果评估

發布時間:2025/3/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tensorlfow2.0 二分类和多分类focal loss实现和在文本分类任务效果评估 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tensorlfow2.0 二分類和多分類focal loss實現和在文本分類任務效果評估

  • 前言
  • 二分類 focal loss
  • 多分類 focal loss
  • 測試結果
    • 二分類focal_loss結果
    • 多分類focal_loss結果
  • 總結


前言

最近看了focal loss的文章,正好在做文本分類的項目,一個是Sentence Bert句子匹配,一個是網易云音樂評論的情緒分類。本人用的框架是tensorflow2.0,所以想嘗試實踐一下focal loss,但是翻遍了網上的文章,不是代碼報錯就是錯誤實現。最后就自己根據focal loss的公式寫了一個,試跑了代碼確認無誤。

tensorflow :2.0.0(GPU上跑)
transformers :3.1


二分類 focal loss

from tensorflow.python.ops import array_ops def binary_focal_loss(target_tensor,prediction_tensor, alpha=0.25, gamma=2):zeros = array_ops.zeros_like(prediction_tensor, dtype=prediction_tensor.dtype)target_tensor = tf.cast(target_tensor,prediction_tensor.dtype)pos_p_sub = array_ops.where(target_tensor > zeros, target_tensor - prediction_tensor, zeros)neg_p_sub = array_ops.where(target_tensor > zeros, zeros, prediction_tensor)per_entry_cross_ent = - alpha * (pos_p_sub ** gamma) * tf.math.log(tf.clip_by_value(prediction_tensor, 1e-8, 1.0)) \- (1 - alpha) * (neg_p_sub ** gamma) * tf.math.log(tf.clip_by_value(1.0 - prediction_tensor, 1e-8, 1.0))return tf.math.reduce_sum(per_entry_cross_ent)

使用方法:

model.compile(optimizer=optimizer,loss=binary_focal_loss,metrics=['acc'])

幾個注意的點:

  • tensorflow2.0 自定義損失函數 默認傳入的是y_true,y_pred的格式,所以在自定義損失函數的時候必須是這個順序,否則會報錯沒有梯度傳入來更新參數。
  • tf2.0 所有的張量運算放在了tf.math.里,所以要用tf.math.log
  • 這里模型最后一層用的是sigmiod激活,所以在損失函數里不需要再使用tf.nn.sigmoid來轉化logits

  • 多分類 focal loss

    def softmax_focal_loss(label,pred,class_num=6, gamma=2):label = tf.squeeze(tf.cast(tf.one_hot(tf.cast(label,tf.int32),class_num),pred.dtype)) pred = tf.clip_by_value(pred, 1e-8, 1.0)w1 = tf.math.pow((1.0-pred),gamma)L = - tf.math.reduce_sum(w1 * label * tf.math.log(pred))return L

    使用方法

    bert_ner_model.compile(optimizer=optimizer, loss=softmax_focal_loss,metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

    幾個注意的點:

  • 與二分類不同這里沒有使用a的系數,我也見過帶有a調整系數的多分類公式,但是要么是只在最后起到縮放loss的功能,要么是需要人工更具類別比例傳入一個N維列表,考慮到人為加入太多超參數,可能會讓調試很不穩定,所以這里直接舍棄了a。
  • 在使用tf.one_hot轉換label的時候(因為這邊傳入的是sparse的label[1,2,4,1,2,3,5])總是提示是float32類型,類型錯誤,所這里用tf.cast轉化成int類型。經過tf.one_hot轉換之后是(None,1,N)(N為你的類別數)所以用tf.squeeze壓縮成(None,N)的shape,方便后面的乘法運算。
  • model.compile時,評估函數如果要看acc,一定要指定SparseCategoricalAccuracy,之前用[‘acc’]發現accu一直上不去,可能是架構無法識別當前的y_pred類型,所以最好指定一下。
  • 這里模型最后一層用的是softmax激活,所以在損失函數里不需要再使用tf.nn.softmax來轉化logits

  • 測試結果

    二分類focal_loss結果

    此處是在Sentence Bert模型上的測試結果

    binary_crossentropy 結果

    可以看到用tf自帶的binary_crossentropy,訓練一輪就已經有過擬合的趨勢了,該用focal_loss可以很好的抑制模型過擬合且模型效果也有1個多點的提升。


    多分類focal_loss結果

    此處是在Roberta評論情緒多分類數據上的結果

    發現loss會下降的越來越慢,這是正常的,需要訓練的輪次也變多,因為這里對loss乘了(1-pred)**gama的系數所以整體更新速度會變慢。

    對比下使用sparse_cross_entropy結果:

    發現并沒有提升,這可能與我的數據集類別分布比較平衡有關。所以focal_loss的使用場景還是要看自己的數據集情況。


    總結

    focal loss的使用還需要根據自己的數據集情況來判斷,當樣本不平衡性較強時使用focal loss會有較好的提升,在多分類上使用focal loss得到的效果目前無法很好的評估。


    完整的模型代碼之后會專門寫一個博客來講,用 tf2.0.0 + transformers 搭一個Sentence Bert也借鑒了很多pytroch的代碼,tf實現比較少,也是自己慢慢摸索出來的。

    總結

    以上是生活随笔為你收集整理的Tensorlfow2.0 二分类和多分类focal loss实现和在文本分类任务效果评估的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。