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)
③损失函数和优化器
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]])
class LinearMoudle(torch.nn.Module):
def __init__(self):
super(LinearMoudle, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
model = LinearMoudle()
criterion = torch.nn.MSELoss(size_average=False)
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次的结果、第二张图片是训练一千次的结果。
增加训练的次数可能会提高准确率,但是还需要考虑其他的因素。因为当训练次数增加时,模型对于训练数据的,损失函数值会逐渐下降,但是对于预测数据其损失函数的值是先下降再上升,这就是过拟合。
|