当前位置:   article > 正文

机器学习----PyTorch模型训练_pytorch训练模型

pytorch训练模型

PyTorch

  • 在前面使用纯手工做了线性回归,线性回归的问题其实就是求解损失函数最小的情况下的w值。
  • 在PyTorch里面很多的函数都进行了封装,我们直接用就可以。

损失函数

手写损失函数
def loss(y, y_pred):
	"""损失函数"""
	# (真实值 - 预测值)^2 的平均值
    return ((y_pred - y)**2).mean()
  • 1
  • 2
  • 3
  • 4
PyTorch封装的损失函数

损失函数就是计算 (预测值-真实值)^2的平均值
(均方误差)

torch.nn.MSELoss()方法参数:

  1. 所有数据的预测值
  2. 所有真实值
  3. (互换位置也一样,因为算的是均方误差)
import torch
X = torch.tensor([1,2,3,4],dtype=torch.float32)
Y = torch.tensor([2,4,6,8],dtype=torch.float32)
w = torch.tensor(0.0,dtype=torch.float32,requires_grad=True)

def forward(x):
    return w * x

# 均方差计算预测值和真实值之间的距离
loss = torch.nn.MSELoss()
# 计算此时的损失
y_pre = forward(X)
l = loss(y_pre,Y)
print(f"此时的损失值:{l}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述


优化器

优化器就是代替了手写梯度下降算法,PyTorch将自动计算梯度并更新参数

定义优化器

optim模块内包含多个优化器,都是基于基本的梯度下降算法改进的算法,可以更快的求出最优的参数解,例如: SGD, Adam,Momentum,RMSProp,这里使用的是SGD梯度下降算法

  1. 需要反向传播更新的参数,可能会有多个需要更新的参数,所以参数1为列表
  2. lr命名参数为学习率
optimizer = torch.optim.SGD([W], lr=learning_rate)
  • 1
完整的一次线性回归

l.backward()损失函数反向传播计算梯度
optimizer.step() 通过优化器 更新w参数 向梯度的方向走一步 (求解loss损失值关于w的偏导值)
optimizer.zero_grad() 清空梯度计算,防止梯度累加导致结果错误

# 创建x、y数据和自定义w参数
X = torch.tensor([1,2,3,4],dtype=torch.float32)
Y = torch.tensor([2,4,6,8],dtype=torch.float32)
w = torch.tensor(0.0,dtype=torch.float32,requires_grad=True)
# 定义学习率 和 训练模型迭代次数
learning_rate = 0.001
n_iters = 1000
# 创建损失函数
loss = torch.nn.MSELoss()
# 创建优化器 把w参数扔进去,要计算损失值关于w的关系(偏导数) 把学习率扔进去
optimizer = torch.optim.SGD([w],lr=learning_rate)

# 正向传播函数(模型)
def forward(x):
    """正向传播函数"""
    return w * x

# 训练模型
for epoch in range(n_iters):
    # 通过正向传播获取到预测值
    y_pred = forward(X)
    # 通过损失函数获取到损失值
    l = loss(y_pred,Y)
    # 反向传播计算梯度
    l.backward()
    # 通过优化器 更新w参数  向梯度的方向走一步
    optimizer.step()
    # 清空梯度计算,防止梯度累加导致结果错误
    optimizer.zero_grad()
    
    if epoch % 100 == 0:
        # 打印纪元 w参数的变化和损失值的变化
        print(f'epoch: {epoch},w: {w},loss: {l:.8f}')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

模型的建立

建立模型就是省去了手写正向传播的函数

torch.nn.Linear(input_size,output_size)表示线性模型的函数

  • input_size: 输入数据的维度
  • output_size: 输出数据的维度

model.parameters()模型中的参数

# 创建x、y数据和自定义w参数
X = torch.tensor([[1],[2],[3],[4]],dtype=torch.float32)
Y = torch.tensor([[2],[4],[6],[8]],dtype=torch.float32)
# 测试集
X_test = torch.tensor([5],dtype=torch.float32)
# 定义模型参数
n_samples,n_features = X.shape
print(n_features)
# 因为当前定义的输入和输出维度一致  所以参数输入和输出都为n_features
model = torch.nn.Linear(n_features,n_features)
# 定义学习率 和 训练模型迭代次数
learning_rate = 0.01
n_iters = 1000
# 创建损失函数
loss = torch.nn.MSELoss()
# 创建优化器 把模型需要更新参数扔进去,要计算损失值关于w的关系(偏导数) 把学习率扔进去
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)


# 训练模型
for epoch in range(n_iters):
    # 通过正向传播获取到预测值
    y_pred = model(X)
    # 通过损失函数获取到损失值
    l = loss(y_pred,Y)
    # 反向传播计算梯度
    l.backward()
    # 通过优化器 更新w参数  向梯度的方向走一步
    optimizer.step()
    # 清空梯度计算,防止梯度累加导致结果错误
    optimizer.zero_grad()
    
    if epoch % 100 == 0:
        # 获取到模型中w参数的值和b的值
        w,b = model.parameters()
        # 打印纪元 w参数的变化和损失值的变化
        print(f'epoch: {epoch},w: {w[0,0].item()},loss: {l}')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述

训练完成之后用测试集测试一下w参数:

test_model = model(X_test)
  • 1

在这里插入图片描述
y = 2x + b 数据5已经无限接近于10


总结:

PyTorch训练模型流程:

  1. 获取训练集,获取输入维度和输出维度
  2. 根据输入和输出维度,创建合适的模型
  3. 创建损失函数
  4. 创建优化器
  5. 训练模型 正向传播➡反向传播➡梯度下降➡循环
  6. 获取测试集评估模型

机器学习不是一下就把解求出来,是向解慢慢逼近的过程。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/965959
推荐阅读
相关标签
  

闽ICP备14008679号