1、模型训练步骤
(1)准备数据集
(2)设计模型,计算y_pred
(3)计算loss
(4)训练周期
①前馈②反馈(梯度)③更新权重
2、知识点
(1)线性单元(Linear Unit)
①线性单元就是计算一次y_pred,也就是一个感知机。
②在实际的计算中,y_pred与X都是向量,而在pytorch里面使用Tensor进行向量的存储,因此在进行数据准备时需要将训练数据存储为Tensor。
注:例如:w矩阵在扩充之前是1*1,那么在实际的计算中,需要将w扩充为31矩阵
③w需要根据z与x来确定形状,而b需要根据x来确定形状。
根
据
线
性
单
元
得
到
:
z
=
w
∗
x
+
b
,
根据线性单元得到:z=w*x+b,
根据线性单元得到:z=w∗x+b,
(2)Loss计算
①loss计算公式
L
o
s
s
=
∑
L
o
s
s
i
Loss = ∑Loss^i
Loss=∑Lossi
注:为了使用pytorch使用backword()计算反馈,因此需要将Loss转化为标量
(3)tensor.nn.类的使用
①定义自己的网络,需要继承Tensor.nn,Moudle类,并实现forward方法
tensor.nn,Moudle()类会自动构建计算图
构建模型:
A、继承torch.nn.Moudle接口
B、定义__init__()构造函数,在实例化对象的时候就会启用
C、构造线性模型对象。【其中torch.nn.Linear是一个线性模型类,其内部实现了__call()__函数,因此在调用的时候可以传参数weight、bias】
②tensor.nn,Linear线性模型
A、tensor.nn.Linear(in_features, out_features, bias=True)
B、in_features:表示输入的样本、out_features:表示输出的样本
class LinearMoudle(torch.nn.Module):
def __init__(self):
super(LinearMoudle, self).__init__()
self.linear = torch.nn.Linear(1, 1)
③损失函数和优化器
#定义损失函数 torch.nn.MSELoss(size_average=True, reduce=True)
# ——> size_average是否求均值、reduce是否降维求和
#SGD——optim里面的一个随机梯度下降算法
#torch.optim.SGD(params【权重参数】, lr=【学习率】, momentum=0【冲量】)
# moudle.parameters()——检查Linear里成员的权重
riterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
3、代码是实现
import torch
# 数据集加载
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
# LinearMoudle类的创建,并继承Moudle
class LinearMoudle(torch.nn.Module):
# 继承类
def __init__(self):
# 继承
super(LinearMoudle, self).__init__()
# 继承linear
# torch.nn.Linear(weight, bits)用于构造对象
# 在类里面定义__call__函数可以使用里面的参数
self.linear = torch.nn.Linear(1, 1)
# 定义前馈函数
def forward(self, x):
# 使用torch里面的线性模型计算预测值
y_pred = self.linear(x)
return y_pred
# 构造对象
model = LinearMoudle()
# 定义损失函数 torch.nn.MSELoss(size_average=True, reduce=True)
# ——> 是否求均值、是否降维求和
criterion = torch.nn.MSELoss(size_average=False)
# 定义优化器
# torch.optim.SGD(params【权重参数】, lr=【学习率】, momentum=0【冲量】)
# moudle.parameters()——检查Linear里成员的权重
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练
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()
# 输出权重和偏移量
print("w=", model.linear.weight.item())
print("bias=", model.linear.bias.item())
# 预测值
x_test = torch.tensor([4.0])
y_test = model(x_test)
print("y_pred=", y_test.data)
第一张图片是训练100次的结果、第二张图片是训练一千次的结果。
增加训练的次数可能会提高准确率,但是还需要考虑其他的因素。因为当训练次数增加时,模型对于训练数据的,损失函数值会逐渐下降,但是对于预测数据其损失函数的值是先下降再上升,这就是过拟合。