目录
1.数据准备
2.设计模型
3.构造损失函数和优化器
4.训练周期(前馈—>反馈—>更新)
5. 代码实现
课程推荐: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
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()# 更新权重woptimizer.step()
5. 代码实现
1~4完整代码:
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()# 更新权重woptimizer.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)