我对每一行代码都做了很详细的解释,相信大家一看就能看懂,如果不懂的地方可以评论区讨论一下:
import torch
#定义网络
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel,self).__init__()
self.linear=torch.nn.Linear(1,1)
def forward(self,x):
y_pred=self.linear(x)
return y_pred
#实例化
a=LinearModel()
#数据集
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[2.0],[4.0],[6.0]])
#定义的损失函数
criterion=torch.nn.MSELoss(size_average=False)
#优化器
optimizer=torch.optim.SGD(a.parameters(),lr=0.01)
#训练轮数
for epoch in range(1000):
y_pred=a(x_data)
loss=criterion(y_pred,y_data)
#.item()只有一个元素才能调用,其作用是返回张量元素值
# print(epoch,loss.item())
#清空梯度
optimizer.zero_grad()
#反向传播,计算当前梯度
loss.backward()
#根据梯度更新网络参数
optimizer.step()
#测试数据
x_test=torch.Tensor([[4.0]])
#测试结果传送给y_test
y_test=a(x_test)
print('测试数据:',x_test.item())
print('测试结果:',y_test.item())
print('权重:',a.linear.weight.item())
print('偏置:',a.linear.bias.item())
实验结果:
该算法也可以使用不同的损失函数,比如:
① L1范数损失 L1Loss:
计算 output 和 target 之差的绝对值。
torch.nn.L1Loss(reduction=‘mean’)
②均方误差损失 MSELoss:
计算 output 和 target 之差的均方差。
torch.nn.MSELoss(reduction=‘mean’)
③交叉熵损失 CrossEntropyLoss:
当训练有 C 个类别的分类问题时很有效. 可选参数 weight 必须是一个1维 Tensor, 权重将被分配给各个类别. 对于不平衡的训练集非常有效。
在多分类任务中,经常采用 softmax 激活函数+交叉熵损失函数,因为交叉熵描述了两个概率分布的差异,然而神经网络输出的是向量,并不是概率分布的形式。所以需要 softmax激活函数将一个向量进行“归一化”成概率分布的形式,再采用交叉熵损失函数计算 loss。
torch.nn.CrossEntropyLoss(weight=None, ignore_index=-100, reduction=‘mean’)
④二进制交叉熵损失 BCELoss:
二分类任务时的交叉熵计算函数。用于测量重构的误差, 例如自动编码机. 注意目标的值 t[i] 的范围为0到1之间.
torch.nn.BCELoss(weight=None, reduction=‘mean’)
⑤BCEWithLogitsLoss:
BCEWithLogitsLoss损失函数把 Sigmoid 层集成到了 BCELoss 类中. 该版比用一个简单的 Sigmoid 层和 BCELoss 在数值上更稳定, 因为把这两个操作合并为一个层之后, 可以利用 log-sum-exp 的 技巧来实现数值稳定.
torch.nn.BCEWithLogitsLoss(weight=None, reduction=‘mean’, pos_weight=None)
大家可以将损失函数变一下,说不定能找到更好的结果。