Linear(),softmax(),CrossEntropyLoss()的一些理解

pytorch的图像分类问题
前一段时间突然迷了,最后的全连接层(FC)输出的维度对应的分类数目(Class_num),这点是没错的,但是交叉熵损失函数公式里边是有预测概率的,必须由softmax得到,但是程序里没有看到softmax(),但是很多都会说到softmax层。后来经过查阅发现,解决办法在交叉熵损失函数里边。 是由交叉熵损失函数的结构解决。

交叉熵损失函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
链接: https://blog.csdn.net/c2250645962/article/details/106014693/?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1.

### am-softmax算法原理 am-softmax是在传统softmax基础上引入角度余弦距离的一种改进版本,旨在增强不同类别之间的区分度。具体来说,在计算过程中加入了角度边距(angular margin),使得模型能够更好地拉大正样本与其他负样本间的差距[^2]。 公式表达如下: \[ J=\frac{1}{N}\sum _{i=1}^{N}-\log \frac{{e}^{\left(\cos (\theta _{y_i}+\alpha )\right)\cdot s}}{{e}^{\left(\cos (\theta _{y_i}+\alpha )\right)\cdot s}+(C−1){e}^{s}} \] 这里\( y_i \)代表第i个输入的真实标签;θ表示特征向量与权重向量间夹角;α为额外增加的角度边距参数;s是一个缩放因子用于调整最终得分分布范围;C则指代总的类别数目。 这种设计有助于提高决策边界清晰度,从而改善分类性能特别是在人脸识别等任务中有显著效果。 ### 实现方式 以下是Python环境下利用PyTorch框架实现的一个简单版am-softmax函数示例: ```python import torch.nn as nn import torch class AMSoftmaxLoss(nn.Module): def __init__(self, num_classes, feat_dim, m=0.35, s=30): super(AMSoftmaxLoss, self).__init__() self.num_classes = num_classes self.feat_dim = feat_dim self.m = m self.s = s # 初始化权重矩阵W self.W = nn.Parameter(torch.randn(feat_dim, num_classes)) def forward(self, x, labels): cos_theta = F.linear(F.normalize(x), F.normalize(self.W)) # 计算cosine相似度 one_hot = torch.zeros_like(cos_theta) one_hot.scatter_(1, labels.view(-1, 1).long(), 1) phi = cos_theta - one_hot * self.m output = self.s * phi loss = F.cross_entropy(output, labels.long()) return loss ``` 此代码片段定义了一个继承自`nn.Module`类的新模块——`AMSoftmaxLoss`,它接收数据维度、类别数量以及两个超参m和s作为初始化参数,并实现了前向传播过程中的核心逻辑。 ### 应用场景 am-softmax广泛应用于各种生物特征识别领域,比如语音验证系统中的人声辨识[^3]。由于其能够在保持较高精度的同时有效降低误判率,因此非常适合于那些对安全性要求较高的场合,如金融支付平台的身份认证环节或是智能家居设备的用户权限管理等方面。另外,在大规模图像检索系统里也能见到该技术的身影,尤其是在行人重识别(Person Re-ID)[^4]这类复杂视觉理解挑战赛上表现尤为突出。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值