昇思MindSpore学习入门-损失函数

损失函数,亦称目标函数,用于衡量预测值与真实值差异的程度。

在深度学习中,模型训练就是通过不断迭代来缩小损失函数值的过程。因此,在模型训练过程中损失函数的选择非常重要,一个好的损失函数能有效提升模型的性能。

mindspore.nn模块中提供了许多通用损失函数,但这些通用损失函数无法满足所有需求,很多情况需要用户自定义所需的损失函数。因此,本教程介绍如何自定义损失函数。

内置损失函数

首先介绍mindspore.nn模块中内置的损失函数

下例以nn.L1Loss为例,计算预测值和目标值之间的平均绝对误差:

其中N为数据集中的batch_size值。

nn.L1Loss中的参数reduction取值可为mean,sum,或none。若reduction 为mean或sum,则输出一个经过均值或求和后的标量Tensor(降维);若reduction为none,则所输出Tensor的shape为广播后的shape。

自定义损失函数

自定义损失函数的方法有两种:一是基于nn.Cell来定义损失函数;二是nn.LossBase来定义损失函数。nn.LossBase继承自nn.Cell,额外提供了get_loss方法,利用reduction参数对损失值求和或求均值,输出一个标量。

下面将分别使用继承Cell和继承LossBase的方法,来定义平均绝对误差损失函数(Mean Absolute Error,MAE),MAE算法的公式如下所示:

上式中𝑓(𝑥)为预测值,𝑦为样本真实值,𝑙𝑜𝑠𝑠为预测值与真实值之间距离的平均值。

基于nn.Cell构造损失函数

nn.Cell是MindSpore的基类,不但可用于构建网络,还可用于定义损失函数。使用nn.Cell定义损失函数的过程与定义一个普通的网络相似,差别在于,其执行逻辑部分要计算的是前向网络输出与真实值之间的误差。

下面展示怎样基于nn.Cell自定义损失函数MAELoss:

基于nn.LossBase构造损失函数

基于nn.LossBase构造损失函数MAELoss与基于nn.Cell构造损失函数的过程类似,都要重写__init__方法和construct方法。

nn.LossBase可使用方法get_loss将reduction应用于损失计算。

损失函数与模型训练

损失函数MAELoss自定义完成后,可使用MindSpore的接口Model中train接口进行模型训练,构造Model时需传入前向网络、损失函数和优化器,Model会在内部将它们关联起来,生成一个可用于训练的网络模型。

在Model中,前向网络和损失函数通过nn.WithLossCell关联起来,nn.WithLossCell支持两个输入,分别为data和label。

多标签损失函数与模型训练

上述定义了一个简单的平均绝对误差损失函数MAELoss,但许多深度学习应用的数据集较复杂,如目标检测网络Faster R-CNN的数据中就包含多个标签,而非简单的一条数据对应一个标签,这时损失函数的定义和使用略有不同。

本节介绍在多标签数据集场景下,如何定义多标签损失函数(Multi label loss function),并使用Model进行模型训练。

多标签数据集

下例通过get_multilabel_data函数拟合两组线性数据𝑦1和𝑦2,拟合的目标函数为:

𝑓(𝑥)=2𝑥+3

最终数据集应随机分布于函数周边,这里按以下公式的方式生成,其中noise为服从标准正态分布的随机值。get_multilabel_data函数返回数据𝑥、𝑦1和𝑦2:

𝑓(𝑥)=2𝑥+3+𝑛𝑜𝑖𝑠𝑒

通过create_multilabel_dataset生成多标签数据集,并将GeneratorDataset中的column_names参数设置为[‘data’, ‘label1’, ‘label2’],最终返回的数据集格式为一条数据data对应两个标签label1和label2。

多标签损失函数

针对上一步创建的多标签数据集,定义多标签损失函数MAELossForMultiLabel。

𝑙𝑜𝑠𝑠1=1𝑚∑𝑖=1𝑚|𝑦1𝑖−𝑓(𝑥𝑖)|

𝑙𝑜𝑠𝑠2=1𝑚∑𝑖=1𝑚|𝑦2𝑖−𝑓(𝑥𝑖)|

𝑙𝑜𝑠𝑠=(𝑙𝑜𝑠𝑠1+𝑙𝑜𝑠𝑠2)2

上式中,𝑓(𝑥) 为样例标签的预测值,𝑦1 和 𝑦2 为样例标签的真实值,𝑙𝑜𝑠𝑠1 为预测值与真实值 𝑦1 之间距离的平均值,𝑙𝑜𝑠𝑠2 为预测值与真实值 𝑦2 之间距离的平均值 ,𝑙𝑜𝑠𝑠 为损失值 𝑙𝑜𝑠𝑠1 与损失值 𝑙𝑜𝑠𝑠2 平均值。

在MAELossForMultiLabel中的construct方法的输入有三个,预测值base,真实值target1和target2,在construct中分别计算预测值与真实值target1、预测值与真实值target2之间的误差,将两误差取平均后作为最终的损失函数值。

多标签模型训练

使用Model连接前向网络、多标签损失函数和优化器时,Model的网络network指定为自定义的损失网络loss_net,损失函数loss_fn不指定,优化器仍使用Momentum。

在未指定loss_fn时,Model会默认network内部已实现损失函数的逻辑,不再在内部使用nn.WithLossCell关联前向网络和损失函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值