目录
1.数据准备
2.设计模型
3.构造损失函数和优化器
4.训练周期(前馈—>反馈—>更新)
课程推荐:05.用PyTorch实现线性回归_哔哩哔哩_bilibili
线性通常是指变量之间保持等比例的关系,从图形上来看,变量之间的形状为直线,斜率是常数。
当要预测的变量 y 输出集合是无限且连续,我们称之为回归。比如,天气预报预测明天是否下雨,是一个二分类问题;预测明天的降雨量多少,就是一个回归问题。
1.数据准备
在pytorch中,计算图使用mini batch方式绘制,所以x和y是n*1的向量张量。
mini batch详解,如图,线性模型的x,y都是3*1的向量张量。
2.设计模型
model = LinearModel(x_data),用于自定义计算模块,复写forward(),返回预测值
torch.nn.Linear(in_features,out_features,bias=True),in_features,out_features为输入样本和输出样本的数量
设计模型代码:
import torch
# 生成两个3*1的向量张量
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
# 继承torch.nn.Module,定义自己的计算模块
class LinearModel(torch.nn.Module):
# 构造函数
def __init__(self):
# 调用父类构造
super(LinearModel, self).__init__()
# Linear对象包含两个成员张量weight和bias
# 定义输入样本和输出样本的维度
self.linear = torch.nn.Linear(1, 1)
# 前馈函数
def forward(self, x):
y_pred = self.linear(x)
return y_pred
# 实例化自定义模型
model = LinearModel()
3.构造损失函数和优化器
torch.nn.MSELoss(size_average=True, reduce=True),size_average是否要求均值,reduce结果是否要降维
torch.optim.SGD(params, lr=required, momentum=0, dampening=0,weight_decay=0, nesterov=False),params参数,lr学习率
# 实例化损失函数,返回损失值
criterion = torch.nn.MSELoss(size_average=False)
# 实例化优化器,优化权重w
# model.parameters(),取出模型中的参数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
不同的优化器:
4.训练周期(前馈—>反馈—>更新)
一轮训练:
①获得预测值
②获得损失值
③梯度归零
④反向传播
⑤更新权重w
完整代码:
import torch
# 生成两个3*1的向量张量
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
# 继承torch.nn.Module,定义自己的计算模块
class LinearModel(torch.nn.Module):
# 构造函数
def __init__(self):
# 调用父类构造
super(LinearModel, self).__init__()
# 实例化的Linear对象包含两个成员张量weight和bias
# 定义输入样本和输出样本的维度
self.linear = torch.nn.Linear(1, 1)
# 前馈函数
def forward(self, x):
# 返回x线性计算后的预测值
y_pred = self.linear(x)
return y_pred
# 实例化自定义模型,返回预测值
model = LinearModel()
# 实例化损失函数,返回损失值
criterion = torch.nn.MSELoss(size_average=False)
# 实例化优化器,优化权重w
# model.parameters(),取出模型中的参数
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)
# 不会产生计算图,因为__str()__
print(epoch, loss)
# 梯度归零
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新权重w
optimizer.step()
# 打印权重和偏值
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)