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 值被控制在相对较小的范围之内,这和我们增加了训练次数有很大关系。

你可能感兴趣的:(PyTorch)