所含内容如下:
- 如何构造神经网络模型;
- 如何构造损失函数;
- 如何构造优化器,如sgd(随机梯度下降);
用pytorch写的模型弹性不错,可以扩展为神经网络;
总体步骤:

第二步就是设计一个计算y^ 的模型;第三步是通过pytorch的接口来计算损失;第四步就是疯狂前向传播(算损失),后向传播(算梯度),更新
在pytorch中,可计算的图是在mini-batch中,所以X和Y是3*1的张量。如下图所示:

注意,最后算出来的loss一定要是个标量,因此要对loss的张量进行求和,并根据情况决定是否要求均值:


Linear类使用说明
这里分别接受了输入/出特征的维数/特征数(指的是输入/出的值的个数),偏执量;

输入多个常数参数可以通过* args来进行调用,不用一个个输入到括号里了;
变量参数可以通过* kwargs来进行调用;
import torch
#1. 准备数据
#将x和y都写成了3*1的向量
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])
#2.设计模型
#需要构造一个计算图,pytorch可以自动求得梯度
#构造模型所使用的都是下面这样的模板
#我们使用的模型都要继承torch.nn.Module,其中包含了许多基本方法
class LinearModel(torch.nn.Module):
#至少要实现下面这两个函数
def __init__(self):
super(LinearModel, self).__init__()
#通过nn.Linear类来构造一个权重和偏执都为1的张量
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
#运用Module所构建的模型可以用其自带的backward函数来根据计算图进行逆向传播
model = LinearModel()
#3. 计算损失并进行优化
criterion = torch.nn.MESLoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

包中自带的算平均loss的函数
reduce用来确定是否要进行降维?不过一般不会用就是了

优化器
优化器不会构成计算图。第一个参数是权重,model.parameters()来检查其成员中是否有对应的权重值,有的话就加到训练的集合中去;第二个参数就是学习率,一般都是取个固定值;
import torch
#1. 准备数据
#将x和y都写成了3*1的向量
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])
#2.设计模型
#需要构造一个计算图,pytorch可以自动求得梯度
#构造模型所使用的都是下面这样的模板
#我们使用的模型都要继承torch.nn.Module,其中包含了许多基本方法
class LinearModel(torch.nn.Module):
#至少要实现下面这两个函数
def __init__(self):
super(LinearModel, self).__init__()
#通过nn.Linear类来构造一个权重和偏执都为1的张量
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
#运用Module所构建的模型可以用其自带的backward函数来根据计算图进行逆向传播
model = LinearModel()
#3. 计算损失并进行优化
criterion = torch.nn.MSELoss(size_average=False)
#优化器对象知道要对哪些参数做优化
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#4.训练过程
for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
#虽然loss是个对象,但是在打印时会自动调用str方法转化为输出字符
print(epoch, loss)
#记得要进行梯度归零
optimizer.zero_grad()
loss.backward()
#用step函数进行更新,会根据所有参数中其所包含的梯度以及学习率来自动更新
optimizer.step()
#其实就是:1.算y^;2. 算loss; 3. 进行反推;4. 进行更新
#1和2其实就是前馈更新操作
#输出权重和偏执
print("w = ",model.linear.weight.item())
print("b = ",model.linear.bias.item())
#测试模型
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print("y_pred = ", y_test.data)

可以看到:100次迭代后的损失值还是挺大的,但是在进行了1000次之后的损失值很小了。此时的w十分接近2,b也很靠近0,预测结果y也十分靠近8,说明效果很好;
因此,想要训练结果更加好,可以通过增加训练次数来达到。但是这一操作也是有风险的:会出现过拟合的状况;

代码的整体步骤
Pytorch的优化器们:

附个官方,去那里看看这些都是干啥的:
Learning PyTorch with Examples — PyTorch Tutorials 1.13.0+cu117 documentation

