PyTorch 笔记(17)— torch.nn 包中常用的损失函数(MSELoss 均方误差、L1Loss 平均绝对误差、CrossEntropyLoss 交叉熵误差)

1. torch.nn.MSELoss

torch.nn.MSELoss 类使用均方误差函数对损失值进行计算,在定义类的对象时不用传入任何参数,但在使
用实例时需要输入两个维度一样的参数方可进行计算。示例如下:

import torch as t

loss_f = t.nn.MSELoss()

x = t.randn(100, 100)
y = t.randn(100, 100)
loss = loss_f(x, y)

print(loss)

以上代码首先通过随机方式生成了两个维度都是(100,100)的参数,然后使用均方误差函数来计算两组参数的损失值,打印输出的结果如下:

tensor(2.0091)

2. torch.nn.L1Loss

torch.nn.L1Loss 类使用平均绝对误差函数对损失值进行计算,同样,在定义类的对象时不用传入任何参
数,但在使用实例时需要输入两个维度一样的参数进行计算。示例如下:

import torch as t

loss_f = t.nn.L1Loss()

x = t.randn(100, 100)
y = t.randn(100, 100)
loss = loss_f(x, y)

print(loss)

以上代码也是通过随机方式生成了两个维度都是(100,100)的参数,然后使用平均绝对误差函数来计算两组参数的损失值,打印输出的结果如下:

tensor(1.1419)

3. torch.nn.CrossEntropyLoss

torch.nn.CrossEntropyLoss 类用于计算交叉熵,在定义类的对象时不用传入任何参数,在使用实例时需要输入两个满足交叉熵的计算条件的参数,代码如下:

import torch as t

loss_f = t.nn.CrossEntropyLoss()

x = t.randn(3, 5)
y = t.LongTensor(3).random_(5)
print("y is {}".format(y))
loss = loss_f(x, y)

print(loss)

这里生成的第 1 组参数是一个随机参数,维度为(3,5);第2组参数是 3 个范围为 0~4 的随机数字。计算这两组参数的损失值,打印输出的结果如下:

y is tensor([1, 3, 3])
tensor(2.3652)

4. 综合示例

在学会使用 PyTorch 中的优化函数之后,我们就可以对自己建立的神经网络模型进行训练并对参数进行优化了,代码如下:

import torch as t

batch_n = 100
input_data = 10000
hidden_layer = 100
output_data = 10

epoch_n = 10000
learning_rate = 1e-4

x = t.randn(batch_n, input_data, requires_grad=False)
y = t.randn(batch_n, output_data, requires_grad=False)

loss_f = t.nn.MSELoss()

models = t.nn.Sequential(
    t.nn.Linear(input_data, hidden_layer),
    t.nn.ReLU(),
    t.nn.Linear(hidden_layer, output_data)
    )

for epoch in range(epoch_n):
    y_pred = models(x)
    loss = loss_f(y_pred, y)
    if epoch % 1000 == 0:
        print("epoch is {}, loss is {:.4f}".format(epoch, loss))
    
    models.zero_grad()
    loss.backward()
    
    for param in models.parameters():
        param.data -= param.grad.data * learning_rate

以上代码中的绝大部分和之前训练和优化部分的代码是一样的,但是参数梯度更新的方式发生了改变。因为使用了不同的模型搭建方法,所以访问模型中的全部参数是通过对 models.parameters() 进行遍历完成的,然后才对每个遍历的参数进行梯度更新。其打印输入结果的方式是每完成 1000 次训练,就打印输出当前的 loss 值,最后输出的结果如下:

epoch is 0, loss is 1.0605
epoch is 1000, loss is 0.6227
epoch is 2000, loss is 0.4338
epoch is 3000, loss is 0.3203
epoch is 4000, loss is 0.2420
epoch is 5000, loss is 0.1849
epoch is 6000, loss is 0.1421
epoch is 7000, loss is 0.1098
epoch is 8000, loss is 0.0855
epoch is 9000, loss is 0.0671

从该结果可以看出,参数的优化效果比较理想,loss 值被控制在相对较小的范围之内,这和我们增加了训练次数有很大关系。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nn.MSELossPyTorch中的一个损失函数,用于回归问题。它计算预测值与真实值之间的均方误差(Mean Squared Error)。均方误差是预测值与真实值之差的平方和的平均值。在PyTorch中,nn.MSELoss可以通过设置reduction参数来决定是否缩减维度以及如何缩减。其中,reduction参数有三个选项: - "none":不缩减维度,输出结果与输入形状相同。 - "mean":将输出结果求平均,即将平方和除以输出元素的个数。 - "sum":将输出结果求和。 因此,nn.MSELoss可以根据具体需求选择合适的reduction参数来获得不同的损失值。例如,设置为"mean"可以得到平均均方误差,设置为"sum"可以得到总均方误差。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Pytorch基础】torch.nn.MSELoss损失函数](https://blog.csdn.net/zfhsfdhdfajhsr/article/details/115637954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [基于MSELoss()与CrossEntropyLoss()的区别详解](https://download.csdn.net/download/weixin_38589812/13760627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值