# tensorflow2.X和pytorch实现polyloss

polyloss是Cross-entropy loss和Focal loss的优化版本，PolyLoss在二维图像分类、实例分割、目标检测和三维目标检测任务上都明显优于Cross-entropy loss和Focal loss。

• 当α j = 1 / j \alpha_j=1/j αj ​=1/j时，PolyLoss等价于常用的Cross-entropy loss，但这个系数分配可能不是最优的。

import tensorflow as tf

def poly1_cross_entropy(epsilon=1.0):
def _poly1_cross_entropy(y_true, y_pred):

pt = tf.reduce_sum(y_true * tf.nn.softmax(y_pred), axis=-1)
CE = tf.nn.softmax_cross_entropy_with_logits(y_true, y_pred)
Poly1 = CE + epsilon * (1 - pt)
loss = tf.reduce_mean(Poly1)
return loss
return _poly1_cross_entropy

def poly1_focal_loss(gamma=2.0, epsilon=1.0, alpha=0.25):
def _poly1_focal_loss(y_true, y_pred):
p = tf.math.sigmoid(y_pred)
ce_loss = tf.nn.sigmoid_cross_entropy_with_logits(y_true, y_pred)
pt = y_true * p + (1 - y_true) * (1 - p)
FL = ce_loss * ((1 - pt) ** gamma)

if alpha >= 0:
alpha_t = alpha * y_true + (1 - alpha) * (1 - y_true)
FL = alpha_t * FL
Poly1 = FL + epsilon * tf.math.pow(1 - pt, gamma + 1)
loss = tf.reduce_mean(Poly1)
return loss
return _poly1_focal_loss



import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import Tensor

class Poly1CrossEntropyLoss(nn.Module):
def __init__(self,
num_classes: int,
epsilon: float = 1.0,
reduction: str = "mean",
weight: Tensor = None):
"""
Create instance of Poly1CrossEntropyLoss
:param num_classes:
:param epsilon:
:param reduction: one of none|sum|mean, apply reduction to final loss tensor
:param weight: manual rescaling weight for each class, passed to Cross-Entropy loss
"""
super(Poly1CrossEntropyLoss, self).__init__()
self.num_classes = num_classes
self.epsilon = epsilon
self.reduction = reduction
self.weight = weight
return

def forward(self, logits, labels):
"""
Forward pass
:param logits: tensor of shape [N, num_classes]
:param labels: tensor of shape [N]
:return: poly cross-entropy loss
"""
labels_onehot = F.one_hot(labels, num_classes=self.num_classes).to(device=logits.device,
dtype=logits.dtype)
pt = torch.sum(labels_onehot * F.softmax(logits, dim=-1), dim=-1)
CE = F.cross_entropy(input=logits,
target=labels,
reduction='none',
weight=self.weight)
poly1 = CE + self.epsilon * (1 - pt)
if self.reduction == "mean":
poly1 = poly1.mean()
elif self.reduction == "sum":
poly1 = poly1.sum()
return poly1

class Poly1FocalLoss(nn.Module):
def __init__(self,
num_classes: int,
epsilon: float = 1.0,
alpha: float = 0.25,
gamma: float = 2.0,
reduction: str = "mean",
weight: Tensor = None,
pos_weight: Tensor = None,
label_is_onehot: bool = False):
"""
Create instance of Poly1FocalLoss
:param num_classes: number of classes
:param epsilon: poly loss epsilon
:param alpha: focal loss alpha
:param gamma: focal loss gamma
:param reduction: one of none|sum|mean, apply reduction to final loss tensor
:param weight: manual rescaling weight for each class, passed to binary Cross-Entropy loss
:param label_is_onehot: set to True if labels are one-hot encoded
"""
super(Poly1FocalLoss, self).__init__()
self.num_classes = num_classes
self.epsilon = epsilon
self.alpha = alpha
self.gamma = gamma
self.reduction = reduction
self.weight = weight
self.pos_weight = pos_weight
self.label_is_onehot = label_is_onehot
return

def forward(self, logits, labels):
"""
Forward pass
:param logits: output of neural netwrok of shape [N, num_classes] or [N, num_classes, ...]
:param labels: ground truth tensor of shape [N] or [N, ...] with class ids if label_is_onehot was set to False, otherwise
one-hot encoded tensor of same shape as logits
:return: poly focal loss
"""

p = torch.sigmoid(logits)

if not self.label_is_onehot:

if labels.ndim == 1:
labels = F.one_hot(labels, num_classes=self.num_classes)

else:
labels = F.one_hot(labels.unsqueeze(1), self.num_classes).transpose(1, -1).squeeze_(-1)

labels = labels.to(device=logits.device,
dtype=logits.dtype)

ce_loss = F.binary_cross_entropy_with_logits(input=logits,
target=labels,
reduction="none",
weight=self.weight,
pos_weight=self.pos_weight)
pt = labels * p + (1 - labels) * (1 - p)
FL = ce_loss * ((1 - pt) ** self.gamma)

if self.alpha >= 0:
alpha_t = self.alpha * labels + (1 - self.alpha) * (1 - labels)
FL = alpha_t * FL

poly1 = FL + self.epsilon * torch.pow(1 - pt, self.gamma + 1)

if self.reduction == "mean":
poly1 = poly1.mean()
elif self.reduction == "sum":
poly1 = poly1.sum()

return poly1


[En]

If you are interested, you can try it yourself.

Original: https://blog.csdn.net/qq_42025868/article/details/124559449
Author: Haohao+++
Title: tensorflow2.X和pytorch实现polyloss

(0)

### 大家都在看

• #### 四、DMSP/OLS夜间灯光数据之GDP空间化的拟合方程获取

一、前言 上一节我们介绍了夜间灯光指数的计算方法，也就是得到了夜间灯光指数之后，然后加上统计年鉴中的GDP就可以进行拟合，拟合得到方程就能进行下一步了。 那么这里要进一步解释一下，…

人工智能 2023年6月18日
0182
• #### RNA 18. SCI 文章中基因集变异分析 GSVA

GSVA 也是 SCI 文章中常见的分析方法，在我们获得多个pathway的时候，可以比较pathway在样本分组中的差异，这样可以更好的确定每个通络的活性。 前言 GSVA全名G…

人工智能 2023年6月19日
0116
• #### 【3D 目标检测】PVRCNN详解(个人阅读心得并总结其他人的结论得出的文章)

第一篇3d检测博客，尽量做的详细。 一 核心思路 文章称该方法把point-based和voxel-based两种方法的优势结合起来，提高了3D目标检测的表现。基于体素的操作可以高…

人工智能 2023年7月9日
0163
• #### 一文搞懂什么是数据仓库(Data Warehouse)数据仓库与数据库区别有哪些？什么是元数据？

大家早上好，本人姓吴，如果觉得文章写得还行的话也可以叫我吴老师。欢迎大家跟我一起走进数据分析的世界，一起学习！感兴趣的朋友可以关注我或者我的数据分析专栏，里面有许多优质的文章跟大家…

人工智能 2023年6月19日
0295
• #### 最基本的25道深度学习面试问题和答案

近年来，对深度学习的需求不断增长，其应用程序被应用于各个商业部门。各公司现在都在寻找能够利用深度学习和机器学习技术的专业人士。在本文中，将整理深度学习面试中最常被问到的25个问题和…

人工智能 2023年6月16日
0136
• #### 用python实现主成分分析（PCA）

用python实现主成分分析（PCA） python应用实例：如何用python实现主成分分析 * 背景 iris数据集简介 算法的主要步骤 代码实现 查看各特征值的贡献率 pyt…

人工智能 2023年5月26日
0189
• #### 制作自己的 tusimple 格式数据集

tusimple 格式数据集制作与标注小结 最近在看 LaneNet ，然后参考网上的博客记录一下自己制作个人 tusimple 格式数据集的过程。 1.前期准备 工具： labe…

人工智能 2023年5月25日
0173
• #### 股票数据可视化

本文通过对股票数据进行可视化数据分析。（tushare ID：452043） tushare介绍 数据爬取 数据可视化分析 3.1. 近三年的走势 3.2. 股票点数的最大值区间 …

人工智能 2023年7月17日
0184
• #### web前端期末大作业：基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站

🎉精彩专栏推荐 💭文末获取联系✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主💂 作者主页: 【主页——🚀获取更多优质源码】🎓 web前端期末大作业： 【📚毕设项目精品实战…

人工智能 2023年6月30日
0165
• #### C++使用onnxruntime/opencv对onnx模型进行推理(附代码)

文章目录 0. onnx模型准备以及测试图 1. c++使用onnxruntime进行推理 2. c++使用opencv进行推理 3. 完整代码 4. c++调用tensorRT的…

人工智能 2023年7月21日
0189

文章目录 * – 4 AdaBoost回归算法 – + 4.1 概要 + 4.2 算法步骤 + 4.3 sklearn中的AdaBoost回归 + * 4….

人工智能 2023年6月18日
0192
• #### Kaggle，上传，GPU，下载

遇到没GPU想训练模型的情况，CPU跑好久，可利用Kaggle的云GPU。 1、注册参考[1]，其中，kaggle官网： 地址 2、进入主页，可用creat创建nootbook，之…

人工智能 2023年7月27日
0149
• #### 深度学习-LSTM预测未来值

** 用LSTM进行多输出预测 **本文基于LSTM使用六小时（360分钟）的数据来预测10分钟后的发电量，主要就是讲解一下写代码过程中遇到的一些不太懂的地方，供同为萌新的参考，已…

人工智能 2023年7月14日
0177

panads：提供两种数据结构 Series 和 DataFrame Series创建： 左序列为索引，右序列为值 import pandas as pd import strin…

人工智能 2023年7月6日
0153
• #### pandas数据加载与存储

提示：文章写完后，目录可以自动生成，如何生成可参考右边的帮助文档 文章目录 前言 一、pandas是什么？ 二、数据加载与存储 * 1.引入库 2.读入数据 – 2.1…

人工智能 2023年7月7日
0149
• #### ucinet软件_干货 | 写论文必备！几款出图很高大上的软件

(友情提醒：请不要盗用文中图片，如盗用于学术或商业目的，我会追究到底) 这篇是干货文，废话不多说。 大家在写论文的时候，研究意义、研究价值那部分，是不是经常往高大上了”…

人工智能 2023年6月1日
0163