函数的粒度

如果程序稍微复杂一点,我们一般需要写很多的代码,因此我们需要良好的组织代码以供复用。在javascript中,对象和函数是组织代码最理想的方式。如果可以使用小型的对象来组织代码,那最理想不过。如果不能,可以使用函数来组织和封装代码块。当函数(包括对象内的方法)比较多时,要考虑函数的粒度,即函数的代码量和功能量。对于一个组织良好的代码来讲, 每个函数的粒度应当适中, 各个函数内部没有重复代码块,函数之间也应当没有重复的代码块。

### 适用于细粒度图像分类的损失函数 对于细粒度图像分类任务,特定类型的损失函数有助于提高模型性能并解决该领域特有的挑战。以下是几种常用的损失函数: #### 1. 级联 Softmax 损失函数 针对多级别类别标签的情况,可以采用级联的 Softmax 损失函数来训练深层卷积神经网络 (DCNN)[^1]。具体来说,在 DCNN 的顶层加入多个全连接层(fc 层),每一层对应于不同的类别层次结构,并分别应用 Softmax 函数计算概率分布。 ```python import torch.nn as nn class HierarchicalCNN(nn.Module): def __init__(self, num_classes_level_1, num_classes_level_2): super(HierarchicalCNN, self).__init__() # 假设已经定义好了基础特征提取部分 self.fc_level_1 = nn.Linear(in_features=..., out_features=num_classes_level_1) self.softmax_level_1 = nn.Softmax(dim=1) self.fc_level_2 = nn.Linear(in_features=..., out_features=num_classes_level_2) self.softmax_level_2 = nn.Softmax(dim=1) def forward(self, x): ... logits_level_1 = self.fc_level_1(x) probs_level_1 = self.softmax_level_1(logits_level_1) logits_level_2 = self.fc_level_2(x) probs_level_2 = self.softmax_level_2(logits_level_2) return probs_level_1, probs_level_2 ``` #### 2. 对比损失函数 Contrastive Loss 对比损失函数用于最小化正样本之间的距离而最大化负样本间的距离[^3]。这种机制特别适合处理类内变化大但类间差距小的数据集,从而增强区分能力。 \[ L_{contrast}=\sum_i \left[y_i d(i)^2+(1-y_i)\max(0,m-d(i))^2\right]\] 其中 \(d(i)=||f(x_i)-f(x_j)||\) 表示两个样本经过编码后的欧氏距离;\(y_i\) 是指示变量,当两样本属于同一类别时取值为 1 否则为 0;m 则是设定好的边界阈值。 #### 3. Triplet Loss 三元组损失通过构建锚点、正面例子以及负面例子组成的三元组来进行学习,目的是让同一种类内的样本更接近彼此的同时远离其他种类的样本。这同样有利于应对细粒度分类中存在的类间相似度过高的问题[^4]。 \[L_{triplet}= \sum_i{\max}(0,\alpha+d(a,p)_i-d(a,n)_i)\] 这里 \(a\) 表示锚点样本,\(p\) 和 \(n\) 分别代表来自相同类别和不同类别的样本;\(\alpha\) 称作间隔因子用来控制难易程度。 这些损失函数的选择取决于具体的任务需求和技术实现细节。例如,如果存在明显的层级关系,则优先考虑使用级联 softmax 损失;而对于那些需要强调个体差异性的场景下,对比损失或 triplet loss 可能会更加有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值