目录
用pytorch实现线性模型
步骤:
1.准备数据集
2.设计模型(构造计算图)
3.构建损失函数和优化器
4.训练周期:前馈算损失,反馈算梯度,用梯度下降算法更新权重
可调用对象
用pytorch实现
1.导入相应的库
2.准备数据集
3.设置学习模型
4.构造损失函数和优化器
5.模型训练
6.画出损失函数与训练轮次的图
课后练习
用pytorch实现线性模型
学习模型
损失函数
随机梯度下降(sgd)
步骤:
1.准备数据集
2.设计模型(构造计算图)
- 需要根据x和z的维度,确定权重w和偏置量b的维度。loss是一个标量,如果是向量的话就不能使用backward了。
- 行表示样本,列表示feature维度
3.构建损失函数和优化器
- 第一个参数为求均值,第二个参数是否降维。
- params权重,lr是学习率,一般设计一个固定的值。momentum是冲量
4.训练周期:前馈算损失,反馈算梯度,用梯度下降算法更新权重
- 1.前馈forward:分为两步:1.求y-hat 2.求loss
- 2.反馈backward,在反向之前首先要置0
- 3.更新
广播机制==自动扩展矩阵维数
可调用对象
如果要使用一个可调用对象,那么在类的声明的时候要定义一个call函数。*args是可变变量
class Foobar:
def __init__(self):
pass
def __call__(self,*args,**kwargs):
pass
def func(*args,**kwargs):
print(args) #输出元组,然后可以取各个元素进行遍历。
print(kwargs) #输出词典
func(1, 2, 4, 3, x=3, y=5)
输出为:
(1, 2, 4, 3)
{'x': 3, 'y': 5}
调用对象实现实例化
class Foobar:
def __init__(self):
pass
def __call__(self,*args,**kwargs):
print("Hello"+str(args[0]))
foobar = Foobar() #实例化
foobar(1,2,3)
用pytorch实现
1.导入相应的库
import torch
import numpy as np
import matplotlib.pyplot as plt
2.准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
3.设置学习模型
class LinearModel(torch.nn.Module): #nn是神经网络
def __init__(self):
super(LinearModel, self).__init__() #super第一个参数是类名,后面调用父类的init()
self.linear = torch.nn.Linear(1,1) #Linear是pytorch的一个类,构造一个对象,Linear包括权重和偏置,Linear也是继承nn.Module的,可以实现反向传播
def forward(self, x):
y_pred = self.linear(x) #实现了一个可调用的对象,linear内做w*x+b
return y_pred
model = LinearModel() #实例化,这个model是callable的,是可以被调用,求出y-hat
4.构造损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
5.模型训练
# 定义空集合
epoch_list = []
loss_list = []
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
# 放到循环后面给空集添加元素
epoch_list.append(epoch)
loss_list.append(loss.item())
print(epoch, loss.item())
optimizer.zero_grad() #梯度归零
loss.backward() #反馈,计算梯度
optimizer.step() #根据梯度和预先设置的学习率进行更新w和b的值
print('w = ',model.linear.weight.item()) #打印数值用item
print('b = ',model.linear.bias.item())
x_test = torch.Tensor([[4.0]])
y_test = model(x_test)
print('y_pred = ',y_test.data)
6.画出损失函数与训练轮次的图
# 画图
plt.plot(epoch_list, loss_list)
# 设置x坐标,y坐标名称,以及这个图像的标题
plt.xlabel('times')
plt.ylabel('loss')
plt.title('SGD')
# 显示图像
plt.show()
结果为
课后练习
利用如下优化器来实现线性回归
注:LBFGS出错
完整代码为:
# 导入相应的库
import torch
import numpy as np
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): #nn是神经网络
def __init__(self):
super(LinearModel, self).__init__() #super第一个参数是类名,后面调用父类的init()
self.linear = torch.nn.Linear(1,1) #Linear是pytorch的一个类,构造一个对象,Linear包括权重和偏置,Linear也是继承nn.Module的,可以实现反向传播
def forward(self, x):
y_pred = self.linear(x) #实现了一个可调用的对象,linear内做w*x+b
return y_pred
model = LinearModel() #实例化,这个model是callable的,是可以被调用,求出y-hat
# 构造损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
#optimizer = torch.optim.Adagrad(model.parameters(), lr=0.01)
#optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
#optimizer = torch.optim.Adamax(model.parameters(), lr=0.01)
#optimizer = torch.optim.ASGD(model.parameters(), lr=0.01)
#optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01)
#optimizer = torch.optim.Rprop(model.parameters(), lr=0.01)
# 模型训练
# 定义空集合
epoch_list = []
loss_list = []
for epoch in range(1000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
# 放到循环后面给空集添加元素
epoch_list.append(epoch)
loss_list.append(loss.item())
print(epoch, loss.item())
optimizer.zero_grad() #梯度归零
loss.backward() #反馈,计算梯度
optimizer.step() #根据梯度和预先设置的学习率进行更新w和b的值
print('w = ',model.linear.weight.item()) #打印数值用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)
# 设置x坐标,y坐标名称,以及这个图像的标题
plt.xlabel('times')
plt.ylabel('loss')
#plt.title('SGD')
#plt.title('Adagrad')
#plt.title('Adam')
#plt.title('Adamax')
#plt.title('ASGD')
#plt.title('RMSprop')
#plt.title('Rprop')
# 显示图像
plt.show()