1.Dataset 和 Dataloader 的区别。
都是来自工具pytorch。
Dataset :dataset 来自torch.utils.data.Dataset,是代表数据的基类,我们自定义的数据类可以通过继承和重写这个抽象类的__getitem__和__len__函数实现。
__getitem__:通过index访问数据,能够同时返回数据和类别对应的标签,这里数据和标签为tensor类型。
_len__:获取数据的个数。
Dataloader:dataloader是处理模式输入数据的一个工具类。组合了数据集加采样器,并在数据集上提供单线程和多线程的可迭代对象。
epoch: 所有的训练样本输入到模型中称为一个epoch;
iteration: 一批样本输入到模型中,成为一个Iteration;
batchszie:批大小,决定一个epoch有多少个Iteration;
迭代次数(iteration)=样本总数/批尺寸(batchszie)
函数原型:
torch.utils.data.DataLoader(dataset, batch_size=1,
shuffle=False, sampler=None,
batch_sampler=None, num_workers=0,
collate_fn=None, pin_memory=False,
drop_last=False, timeout=0,
worker_init_fn=None, multiprocessing_context=None)
2.深度学习中常见的损失函数有那些?
[1]针对分类任务
--多分类任务的交叉熵损失函数:
--二分类任务的交叉熵损失函数:
--focal loss 解决难易样本数量不均衡问题和正负样本数量不均衡问题。
focal loss 存在的问题就是:
1.参数的选择对收敛有影响。
2.关注困难样本会导致过分关注噪声点、离群点,反而不易收敛。
[2]针对回归任务
--MAE损失(Mean Absolute Loss)也被称为L1loss,是以绝对误差作为度量。
--MSE损失(Mean Square Loss)也被称为L2Loss,是以误差的平方和作为度量。
异常值
MSE对异常值敏感,因为它的惩罚是平方的,所以异常值的loss会非常大。
MAE对异常之不敏感,
不妨设拟合函数为常数,那么MSE就相当于所有数据的均值(列出loss对c求导即可),而MAE相当于所有数据的中位数,所以会对异常值不敏感。
优化效率
MAE不可导而且所有的导数的绝对值都相同,优化时无法确定更新速度,
MSE可导,有closed-form解,只需要令偏导数为0即可。
如何选择
如果想要检测异常值则使用MSE,如果想学习一个预测模型则建议使用MAE,或者先进行异常值处理再使用MSE
--smooth L1 loss
其中:𝑥=f(x)−y 为真实值和预测值的差值
--Huber Loss 也可以称为:Smooth Mean Absolute Error
为什么要使用 Huber Loss
使用MAE训练神经网络的一个大问题是它的持续大梯度,这可能会导致在使用梯度下降训练结束时丢失最小值。对于MSE,当损失接近其最小值时,梯度减小,使其更加精确。
在这种情况下,Huber损失是非常有用的,因为它在减小梯度的最小值附近弯曲。它比MSE对离群值更稳健。因此,它结合了MSE和MAE的优良性能。然而,Huber损失的问题是我们可能需要训练超参数delta,这是一个迭代过程。
--Log-Cosh Loss
Log-Cosh是一个回归损失函数,它比L2更平滑的损失函数。Log-cosh是预测误差使用的数学函数是双曲余弦的对数。公式如下:
优点: 1. 该损失函数 数学意义近似 (x^2)/2;其中,对于非常大的x 数学意义近似于 ;这里的数学意义表明:该函数的工作方式与均方差公式有点类似,该损失函数,具有Huber损失函数的所有优点,并且处处可微。
[3] 针对同类样本和不同样本之间差异的loss triplet loss
triplet loss的计算是基于一个三元组计算同类样本和不同类样本之间的距离差,其中a表示选定的锚点,p表示与a同类别的样本,n表示与a不同类别的样本。
的作用:
还没有评论,来说两句吧...