8.paddlepaddle之loss损失函数自定义

1.前言

损失函数是是用来估量你模型的预测值f(x)与真实值Y的不一致程度。

不同的损失函数对模型拟合会有不同的效果,损失函数越小,一般模型的鲁棒性就越好。

在深度学习中,我们经常需要调整损失函数来达到一些效果倾斜的目的。

2.十行代码自定义损失函数

import paddle
class MyLoss(paddle.nn.Layer):
    def __init__(self):
        super().__init__()

    def forward(self, x, label):
        # 使用paddle内置的cross_entropy算子实现算法
        loss = paddle.nn.functional.cross_entropy(x,label)
        label = paddle.cast(label[0],dtype='float32')
        loss1 = paddle.nn.functional.square_error_cost(x[:,1],label)
        loss = 0.7*loss + 0.3*loss1
        return loss

如上,一个二分类问题,我们即使用了交叉熵损失,又使用了均方损失,并赋予两个损失不同的权重。

由于交叉熵损失与均方损失需要的输入不一样,所以对label进行了cast处理。

下面验证一下:

myloss = MyLoss()
x = paddle.to_tensor([[0.0,0.9]])
label = paddle.to_tensor([[1]])
loss = myloss(x,label)
print(loss)
loss.backward()

打印结果:Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True, [0.24180774])

可以看到损失结果正确输出,顺利执行,在这里我们输入的是一个softmax二元结果。

3.使用自定义损失函数训练

使用自定义损失函数训练也是相当简单的。

在这里我们使用MNIST作为我们的数据集,并使用paddle内置的lenet进行训练,验证自定义损失函数。

由于MNIST是10分类,先将自定义损失函数简单修改。

class MyLoss(paddle.nn.Layer):
    def __init__(self):
        super().__init__()

    def forward(self, x, label):
        # 使用paddle内置的cross_entropy算子实现算法
        loss = 10*paddle.nn.functional.cross_entropy(x,label)
        return loss

然后将损失函数加载进模型训练,代码如下:

from paddle.vision.transforms import Normalize

transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)

lenet = paddle.vision.models.LeNet(num_classes=10)
model = paddle.Model(lenet)
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              MyLoss(),
              paddle.metric.Accuracy())
# 模型训练
model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)

执行训练,可以看到一上来的loss挺大的,由于我们将loss放大10倍的缘故。 

随着时间的变化,step增大,acc变高,loss也逐渐变小。

至此自定义损失函数结束。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kakaccys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值