pytorch学习笔记(四):线性回归(用pytorchAPI)

2022-06-14 10:40:14 浏览数 (1)

步骤: 1、准备训练集 2、设计模型 3、创建损失函数和优化器 4、训练

代码语言:javascript复制
def func(*args, **kwargs):
    print(args)
    print(kwargs)

func(1,2,3,4,a=1,b=2,c=3)


输出:
(1, 2, 3, 4)
{'a': 1, 'b': 2, 'c': 3}

定义函数时,*args作用:传入参数个数不限 **kwargs作用:将“a=1”形式的参数转化成字典

准备训练集 数据集和之前本专栏第一篇的线性模型一样

设计模型

代码语言:javascript复制
class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)  # 1,1表示设置的线性模型中有两个参数w和b

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred


model = LinearModel()

pytorch的nn库中有许多默认模型,nn即neural network

函数torch.nn.Linear(in_features,out_features,bias=True) in_features:指的是输入的二维张量的大小 out_features指的是输出的二维张量的大小 偏置bias默认为True

创建损失函数和优化器

代码语言:javascript复制
criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

损失函数这里采用了MSELoss:MSE即(y’-y)^2,size_average即是否/N,除不除一般差不多 torch.optim.SGD(model.parameters(), lr=0.01)中 model.parameters()为模型的参数 使用时,它会检测实例化的model中所有成员中的参数,比如本例中的model下有liner成员,liner中有w和b两个参数,运行本条语句,即告诉程序有这两个参数需要梯度下降。 lr即学习率

训练

代码语言:javascript复制
for epoch in range(100):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print (epoch,loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

optimizer.zero_grad()梯度清零不可少 optimizer.step()更新update

检测

代码语言:javascript复制
# Output weight and bias
print ('w = ', model.linear.weight.item())
print ('b = ', model.linear.bias.item())

# Test Model
x_test = torch.Tensor([[ 4.0 ]])
y_test = model(x_test)
print ('y_pred = ', y_test.data)

顺便提一下交叉验证集的意义:当训练次数过多时候,容易发生过拟合,这时候在训练集上切出一部分做交叉验证集,分训练次数进行画图,如果验证集的损失函数上升就代表次数过多了,发生过拟合。

完整代码:

代码语言:javascript复制
import torch

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)  # 1,1表示设置的线性模型中有两个参数w和b

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred


model = LinearModel()

criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

for epoch in range(100):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print (epoch,loss)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# Output weight and bias
print ('w = ', model.linear.weight.item())
print ('b = ', model.linear.bias.item())

# Test Model
x_test = torch.Tensor([[ 4.0 ]])
y_test = model(x_test)
print ('y_pred = ', y_test.data)

除了SGD,pytorch还有其它的优化器,这里不作进一步研究

0 人点赞