PyTorch 01—深度学习基础与线性回归实例

前言

该博客是自己在学习PyTorch过程中的笔记,仅仅为了督促自己,笔记中如有错误,欢迎批评指正。关于配置环境网上有很多教程,在这里就不赘述了。

基础学习基础

上图是一幅受教育情况与收入的数据集表现形似。

单变量线性回归

首先需要明白特征和标签的含义:

特征:指输入变量,即简单线性回归中的 x 变量;简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征 。

标签:是我们要预测的事物,即简单线性回归中的 y 变量。标签可以是年薪、图片中显示的动物品种、音频剪辑的含义或任何事物。

单变量线性回归算法(比如,x代表学历,f(x)代表收入):f(x) = w*x + b;我们使用f(x)这个函数来映射输入特征和输出值。

目标:预测函数f(x)与真实值之间的整体误差最小

那么如何定义误差最小呢?

损失函数:使用均方差作为作为成本函数,也就是 预测值真实值之间差的平方取均值。

优化的目标:找到合适的 wb ,使得 (f(x) - y)²越小越好,y代表实际的收入。

如何优化:使用梯度下降算法

代码实现

读取数据集


首先是引入必要的库:

import torch
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from torch import nn 
# PyTorch的nn模块为我们提供了一系列的成熟的层和激活函数等等,可以像搭建积木一样快速创建复杂模型

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False   #用来正常显示负号


接着是读取数据集:

# 使用pandas的read_csv读取数据集
data = pd.read_csv('daatset/Income1.csv')
data.info() #  # 返回文件的整体情况

 运行结果:


绘制数据集的散点图:

plt.scatter(data.Education,data.Income)
plt.xlabel('受教育年限')
plt.ylabel('收入情况')
plt.show()

运行结果:


创建模型 


 数据预处理:

 data.Education返回的是pandas的对应的数据类型,我们要转换为tensor的数据类型。data.Education.values 返回对应的ndarray对象,返回的是一个array。
对于模型来讲,一个array代表一个数据(样本),这样显然是不合适的,我们需要把它reshape成多个数据。data.Education.values.reshape(-1,1),这样程序会把数据转换成只有一列,至于行数根据具体数据来定。模型就会把每一行当成一个样本。

X = data.Education.values.reshape(-1,1).astype(np.float32)
# 转换数据类型为(30,1)的形状,数据类型变为float32

X = torch.from_numpy(X) 
# 使用torch的from_numpy方法将ndarray转换为tensor
# X是每个样本的特征

Y = torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32))
# Y是每个样本对应的标签

正式开始创建模型

PyTorch的nn给我们预设了很多层。
相当于创建了 output=w@input+b,@代表矩阵乘法。会随机初始化权重 w和b ,model(input) 等价于 w@input+b
input和output长度都是1,因为这是单变量线性回归。nn.Linear就是完成这样一步的操作
model = nn.Linear(in_features=1,out_features=1) 
# 创建线性层
# 参数含义:(输入特征长度,输出特征长度)。model(input)等价于w@input+b 


loss_fn = nn.MSELoss()  # 损失函数计算方法
opt = torch.optim.SGD(model.parameters(),lr=0.0001) 
# 使用MSE均方误差评价线性模型的指标,MSE作为损失函数,MSE越小越好
# 优化算法是SGD,即随机梯度下降。torch.optim模块内置很多优化算法。
# SGD的参数是需要优化的参数(在这里需要优化的参数是w和b)和学习速率
# model.parameters()返回model的参数

 训练模型与结果可视化


所谓的训练过程,就是把输入带到我们的模型当中去,计算出一个预测的结果,然后我们把预测结果和真实结果送入损失函数当中去,计算出一个损失,再使用我们的优化方法根据损失去优化模型的参数。优化方法会根据损失,计算如何去优化参数(如w何b)

for epoch in range(5000):  # 把全部数据训练5000次
    for x,y in zip(X,Y):    # 使用zip方法,将数据集特征和标签一一对应起来,一次只拿一个样本和        
                                # 对应的标签
        y_pred = model(x)   #预测值
        loss = loss_fn(y,y_pred) # 根据预测值和实际值计算损失函数
        
        #这时候得到了loss损失值,然后就可以反向传播去求解权重(w和b)的梯度了
        #所谓的梯度就是求解权重去移动的方向(是变大还是变小),反向传播
        #求解权重梯度可以直接在loss上调用loss.backward
        #在求解梯度之前,需要把原有梯度清空,因为梯度会在参数上进行累计,不会在每一步迭代当中清零
        
        opt.zero_grad() # 把参数原有的梯度清零
        loss.backward() # 反向传播,求解梯度,即求解权重应该往哪个方向上移动使得loss最小
        opt.step()      # 优化模型参数。因为opt在初始化的时候已经放入了所要优化的参数,所以执行 
                           # step方法进行优化就可以了,优化的过程就是在每一个权重上减去它的梯度。
        
        
        

当训练完毕之后,这个模型就会变得和原有数据尽量拟合了。 X是tensor类型,所matplotlib不能识别,调用tensor的.numpy方法转换为ndarray。 model(X)是预测结果,预测结果也是一个tensor,并且这个tensor包含着梯度,可以使用.data取出其中的值,值也是一个tensor,使用.numpy()将值转换为ndarray 

model.weight # 线性模型的w
model.bias # 线性模型的偏执b
plt.scatter(data.Education,data.Income) # 数据集分布情况
plt.plot(X.numpy(),model(X).data.numpy(),c='r') # 模型拟合情况

运行情况:

总结 

至此,PyTorch的一个入门实例就完成了,后序会再更新博客的。 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心之所向便是光v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值