赞
踩
1.准备数据集
dataset和dataloader
2.设计模型(计算y帽)
3.构造损失函数和优化器(使用pytorch的封装接口)
4.训练过程
前馈(算损失-构建计算图)、反馈(算梯度)、更新(用梯度下降更新)
import torch
# x,y这里都是张量
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): # 表明从Moudle类继承
# 以下两个类是必须要写的
def __init__(self):
super().__init__() # 调用父类的__init__(),这句无脑写就可以
# 对Linear进行实例化,创建名为linear的对象,Linear是继承自Moudle的,Moudle里面有__call__()函数
self.linear = torch.nn.Linear(1, 1) # (1,1)代表输入的是1维数据(只有1个feature-只有1列),输出也是1维数据
def forward(self, x): # 只能叫forward
# 下面的实现结构是:对象(),即对象是可调用的,传入x就可以进行计算
y_pred = self.linear(x) # 计算y_hat,即wx+b(预测值)
return y_pred
# 实例化上面创建的类
model = LinearModel() # model也是可调用的,model(x)会自动送入forward(x)里,因为__call__()里会调用forward
快捷键 command,查看被继承的类的完整代码
损失函数
# 实例化MSELoss,需要y_hat和y两个参数来求损失
criterion = torch.nn.MSELoss(size_average=False,reduce=True)
优化器
# 实例化SGD,可以求梯度
# parameters()可以求得所有需要更新(优化)的参数(w,b),lr是自己设定的学习率
optimizer = torch.nn.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.item()) # 这里的loss是标量 # 梯度清零 optimizer.zero_grad() # 反馈 loss.backward() # 求梯度 # 更新 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)
输出
0 25.836095809936523 1 18.030044555664062 2 12.605081558227539 3 8.834733963012695 4 6.214179039001465 5 4.3926191329956055 6 3.126283884048462 7 2.2457785606384277 8 1.6333876848220825 9 1.2073142528533936 10 0.91071617603302 11 0.7040932774543762 12 0.5599988102912903 13 0.45935899019241333 14 0.38891932368278503 15 0.3394688665866852 16 0.3046071529388428 17 0.2798873782157898 ···· 93 0.1312834471464157 94 0.13033844530582428 95 0.12940005958080292 96 0.12846867740154266 97 0.1275438666343689 98 0.12662562727928162 99 0.12571397423744202 w = 1.7631036043167114 b = 0.5385211706161499 y_pred= tensor([[7.5909]])
import torch import matplotlib.pyplot as plt 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): # 表明从Moudle类继承 # 快捷键 ctrl+H # 以下两个类是必须要写的 def __init__(self): super().__init__() # 调用父类的__init__(),这句无脑写就可以 # 对Linear进行实例化,创建名为linear的对象,Linear是继承自Moudle的,Moudle里面有__call__()函数 self.linear = torch.nn.Linear(1, 1) # (1,1)代表输入的是1维数据(只有1个feature-只有1列),输出也是1维数据 def forward(self, x): # 只能叫forward # 下面的实现结构是:对象(),即对象是可调用的,传入x就可以进行计算 y_pred = self.linear(x) # 计算y_hat,即wx+b(预测值) return y_pred # 实例化上面创建的类 model = LinearModel() # model也是可调用的,model(x)会自动送入forward(x)里,因为__call__()里会调用forward # 实例化MSELoss,需要y_pred和y求损失 criterion = torch.nn.MSELoss(size_average=False,reduce=True) # 实例化SGD,可以求梯度 # parameters()可以求得所有需要更新(优化)的参数(w,b),lr是自己设定的学习率 optimizer = torch.optim.SGD(model.parameters(), lr=0.005) loss_list = [] epoch_list = [] for epoch in range(100): # 前馈 y_pred = model(x_data) loss = criterion(y_pred,y_data) print(epoch,loss.item()) # 这里的loss是标量 epoch_list.append(epoch) loss_list.append(loss.item()) # 梯度清零 optimizer.zero_grad() # 反馈 loss.backward() # 求梯度 # 更新 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) plt.plot(epoch_list, loss_list) plt.xlabel('epoch') plt.ylabel('loss') plt.show()
训练轮数epoch-损失loss图
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。