Pytorch深度学习实践(b站刘二大人)P5讲(用Pytorch实现线性回归)

用Pytorch实现线性回归:

1.准备数据集
2.设计模型(计算y_pred)
3.构造损失函数和优化器
4.训练周期(前馈、反馈、更新)

1.准备数据集

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

其中x、y分别是3 *1的矩阵

2.设计模型(计算y_pred)

我们的模型类应该从nn.Module继承,它是所有神经网络模块的基类

import torch
 
 
class LinearModel(torch.nn.Module):
    #__init__,forward这两个函数必须实现
    def __init__(self):        # 构造函数:初始化对象默认调用的函数
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)   # 构造对象,输入特征数为1,输出特征数为1

 
    def forward(self, x):      
        #nn.Linear类实现了__call__(),使得该类实例可以像函数一样调用
        #通常情况下forward()将被调用
        y_pred = self.linear(x)  #在对象后面加(),实现可调用对象
        return y_pred
 
# 实例化对象
model = LinearModel()

其中,

self.linear = torch.nn.Linear(1, 1)

Pytorch深度学习实践(b站刘二大人)P5讲(用Pytorch实现线性回归)_第1张图片torch.nn.Linear是pytorch中的一个类,类的后面加括号,构造了一个对象,Linear这个对象它包含了权重和偏置这两个tensor,可以直接用Linear实现 xw + b ,Linear 也是继承至Module,能够自动进行反向传播。self.linear,self里的 linear 它是一个对象,对象的类型是torch下nn(Neural Network)这个模块中的Linear 这个类。

 

3.构造损失函数和优化器

# 定义MSE(均方差)损失函数,size_average=False不求均值
criterion = torch.nn.MSELoss(size_average=False)  
# 对整个模型进行优化,优化器不会构建计算图。
#optim优化模块的SGD,第一个参数是取得模型中的全部参数  
#parameters()会检测moduel中的所有成员,如果成员里有相应的权重,
#它就把这些都加到你最后要进行的训练的结果上)  学习率为0.01 
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

4.训练周期(前馈、反馈、更新)


for epoch in range(100):
    y_pred = model(x_data)   #计算 y_pred
    loss = criterion(y_pred, y_data)  #计算损失
    print(epoch, loss.item())
 
   
    optimizer.zero_grad()  #所有权重每次都梯度清零
    loss.backward()        # 反向传播求梯度
    
    optimizer.step()       #更新,step()更新函数,它会根据所有参数里面它所包含的梯度以及我们预先设置的学习率来进行自动更新

完整代码:

import torch

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

# Design Model
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

model = LinearModel()

# Construct Loss & Optimizer
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

# Training Cycle
for epoch in range(1000):
	y_pred = model(x_data)
	loss = criterion(y_pred,y_data)
	print(epoch,loss.item())

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

# Test Model
print('w = ',model.linear.weight.item())   # w是一个矩阵, .item把矩阵的数值取出来
print('b = ',model.linear.bias.item())     # b是一个矩阵, .item把矩阵的数值取出来

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

你可能感兴趣的:(pytorch,深度学习,线性回归)