4746|3

510

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

《机器学习算法与实现 》Pytorch [复制链接]

本帖最后由 dirty 于 2024-7-16 23:34 编辑

      PyTorch是一个深受研究人员喜爱的深度学习框架,其功能丰富,使用灵活。在 pyTorch 中,可以调整操作流程,对整个过程进行控制。PyTorch还支持高性能计算,可将PyTorch视为有GPU支持的Numpy。现在有多个高级接口的基于 PyTorch 的深度学习框架,如 FastAI、Lightning、Ignite,使用这些框架可更快地开发深度学习应用。

      张量(Tensor)是一种特殊的数据结构,它类似于数组和矩阵。在PyTorch 中,使用张量来编码模型的输入、输出和参数。张量类似于NumPy的ndarray,不同之处是张量可在 GPU 或其他硬件加速器上运行。

      Tensor生成,代码如下

import torch
import numpy as np
#创建一个 numpy
ndarraynumpy_tensor =np.random.randn(10,20)
#使用下面两种方式将 numpy 的ndarray 转换为 tensor:
pytorch_tensor1 = torch.tensor(numpy_tensor)
pytorch_tensor2 = torch.from_numpy(numpy_tensor)

Tensor转换

#如果PyTorch tensor在CPU上
numpy_array = pytorch_tensor1.numpy()
#如果PyTorch tensor 在GPU 上
numpy_array = pytorch_tensor1.cpu().numpy()

将Tensor 转换到 GPU 上

#第一种方式是定义 cuda 数据类型
# 定义默认 GPU 的数据类型
dtype = torch.cuda.FloatTensor
gpu_tensor= torch.randn(10,20).type(dtype)

#第二种方式更简单,推荐使用
gpu_tensor1 = torch.randn(10,20).cuda(0)  #将tensor 放到第一个GPU上使用

gpu_tensor2= torch.randn(10,20).cuda(1)  #将tensor 放到第二个 GPU上

将Tensor 转换到 CPU上

cpu_tensor =gpu_tensor.cpu()

Tensor 的属性

#通过如下两种方式得到 tensor 的大小
print(pytorch_tensor1.shape)
print(pytorch_tensor1.size())

#得到 tensor 的数据类型
print(pytorch_tensor1.type())
print(gpu_tensor.type())

#得到 tensor 的维度
print(pytorch_tensor1.dim())
#得到 tensor 的所有元素个数
print(pytorch_tensor1.numel())

 

      这里引入PyTorch 来构建神经网络模型。神经网络是由多个神经元堆叠在一起形成的网络,主要包括整入层、隐意层和轮出层。输入层由特征数量决定,输出层则由所要解决的问题决定,隐藏层的网络层数及每层的神经元数是可以调节的超参数,不同的层数和每层的网络参数都对模型有一定的影响。                                          

      使用PyTorch实现神经网络,首先生成一些测试数据,代码如下,这里对源代码稍作修改,以便X、Y轴显示负数.

import torch
import numpy as np
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt

'''''''''''''''生成数据'''''''''''''''
np.random.seed(1)
m = 400         #样本数量
N = int(m/2)    #每一类的点的数量
D=2             #维度
x= np.zeros((m, D))
y=np.zeros((m,1),dtype='uint8')     #label向量,0-红色,1-蓝色
a = 4
#生成两类数据
for j in range(2):
    ix = range(N*j,N*(j+1))
    t= np.linspace(j*3.12,(j+1)*3.12,N)+ np.random.randn(N)*0.2
    r= a*np.sin(4*t)+ np.random.randn(N)*0.2        #radius
    x[ix]= np.c_[r*np.sin(t),r*np.cos(t)]
    y[ix] = j
# 绘制生成的数据
plt.scatter(x[:,0],x[:,1],c=y.reshape(-1),s=40,cmap=plt.cm.Spectral)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.title("PyTorch生成数据")
plt.show()

 

      逻辑斯蒂回归并不能很好地区分复杂的数据集,因为逻辑斯蒂回归是一个线性分类器,这里略过具体讲使用PyTorch实现多层神经网络。程序架构与前面的程序的架构类,只是要将网络模型定义部分改成多层神经网络,其他代码几乎不变。网络正向计算的函数是ip_network(),在这个函数中依次将输入数据和网络连接权重相乘,然后使用激活函数进行变换,完整代码如下:

import torch
import numpy as np
from torch import nn
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt


#生成数据
np.random.seed(1)
m = 400         #样本数量
N = int(m/2)    #每一类的点的数量
D=2             #维度
x= np.zeros((m, D))
y=np.zeros((m,1),dtype='uint8')     #label向量,0-红色,1-蓝色
a = 4

#生成两类数据
for j in range(2):
    ix = range(N*j,N*(j+1))
    t= np.linspace(j*3.12,(j+1)*3.12,N)+ np.random.randn(N)*0.2
    r= a*np.sin(4*t)+ np.random.randn(N)*0.2        #radius
    x[ix]= np.c_[r*np.sin(t),r*np.cos(t)]
    y[ix] = j



###############################################################
'''''''''使用PyTorch实现多层神经网络'''''''''
x= torch.from_numpy(x).float()
y= torch.from_numpy(y).float()

#定义两层神经网络的参数
w1= nn.Parameter(torch.randn(2,4)*0.01) #输入维度为2,隐藏层神经元
b1 = nn.Parameter(torch.zeros(4))
w2= nn.Parameter(torch.randn(4,1)*0.01) #隐藏层神经元数量为4,输出
b2 =nn.Parameter(torch.zeros(1))
# 定义模型
def mlp_network(x):
    x1 = torch.mm(x,w1)+b1
    x1 = F.tanh(x1)     #使用 PyTorch 自带的 tanh 激活函数
    x2= torch.mm(x1,w2)+ b2
    return x2
#定义优化器和损失函数
optimizer =torch.optim.SGD([w1,w2,b1,b2],1.)
criterion =nn.BCEWithLogitsLoss()

# 网络训练 10000 次
for e in range(10000):
    #正向计算
    out = mlp_network(Variable(x))
    #计算误差
    loss = criterion(out,Variable(y))
    #计算梯度并更新权重
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    # if(e +1)% 1000 == 0:
    #     print('epoch:{},loss:{}'.format(e+1, loss.data[0]))

def plot_decision_boundary(model,x,y):
    # Set min and max values and give it some padding
    x_min,x_max=x[:,0].min()-1,x[:,0].max()+ 1
    y_min,y_max=x[:,1].min()-1,x[:,1].max()+1
    h=0.01 # Generate a grid of points with distance h between them
    xx,yy= np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min, y_max, h))
    # Predict the function value for the whole grid
    Z = model(np.c_[xx.ravel(),yy.ravel()])
    Z=Z.reshape(xx.shape)
    #Plot the contour and training examples
    plt.contourf(xx,yy,Z,cmap=plt.cm.Spectral)
    plt.ylabel('x2')
    plt.xlabel('x1')
    plt.scatter(x[:,0],x[:,1],c=y.reshape(-1),s=40, cmap=plt.cm.Spectral)

#多层神经网络结果可视化
def plot_network(x):
    x= Variable(torch.from_numpy(x).float())
    x1= torch.mm(x,w1)+ b1
    x1 = F.tanh(x1)
    x2=torch.mm(x1,w2)+ b2
    out = F.sigmoid(x2)
    out =(out> 0.5)*1
    return out .data.numpy()

plot_decision_boundary(lambda x: plot_network(x),x.numpy(), y.numpy ())
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.title('2层神经网络')
plt.show()

      可以看到,神经网络能够非常好地分类这个复杂的数据集。与前面的逻辑斯蒂回归相比,神经网络有多个处理层,能够构成复杂的非线性分类器,导致神经网络分类的边界更复杂,处理数据的能力更强。使用 PyTorch 实现逻辑斯蒂回归和多层神经网络的程序非常相似,不同之处仅为正向计算的不同。在程实现中,不需要关心梯度的计算和参数的更新,因此降低了编程的难度。

      前面的线性回归模型、逻辑斯蒂回归模型和神经网络而言,构建它们时就定义了所需的参数。这样搭建较小的模型是可行的,但对大模型而言,手动定义参数就显得非常麻烦,所以 PyTorch 提供了两个模块来帮助构建模型:一个是 Sequential,另一个是 Module。Sequential允许构建序列化模块,Module是一种更灵活的模型定义方式。

      PyTorch 拥有强大的神经网络定义、实现、参数更新等工具,能够极大地降低神经网络实现的难度。在前面给出的例子中,数据比较简单,无法充分体现神经网络的能力。通过引入NNIST手写数字、CIFAR-10 数据集及对应的神经网络训练技巧,使用 PyTorh 实现多层神经网络.

      MNIST 数据集是一个比较常用的数据集,主要用来测试机器学习算法的性能。深度神经网络以对手写数字图像进行分类,任务是给出一幅手写数字图像,让神经网络识别其是0到9十个数字中的哪个数字。下面以 MNIST 数据集为例,介绍深度神经网络的定义和训练。PyTorch 中内置了 MNIST 数据集的加载类。

      CFAR-10是一个更接近普适物体的彩色图像数据集,共包含如下 10类 RGB 彩色图片;飞(aimiane)、汽车(automobile)、鸟(bird)、猫(cat)、鹿(dcer)、狗(dog)、蛙(fog)、马(hor船(ship)和卡车(tck)。

      后面部分讲了网络训练,分析了迭代次数与训练数据的损失与准确率曲线。对于模型优化求解,PyTorch支持多种优化方式,包括随机梯度下降法、Adam 优化器等,可以根据问题选择最优的求解器。

      本章的学习,对PyTorch有了更深入的认知与理解,讲解内容由浅入深、循序渐进,结合案例,更能体现学有所用,梳理学习回顾,也会有常读常新的收获。

 

最新回复

pytorch确实是机器学习的核心,必须要把它学好,加油,撸起袖子,甩开胳膊加油学!!! ,   详情 回复 发表于 2024-8-8 12:12
点赞 关注
个人签名

保持热爱


回复
举报

7196

帖子

2

TA的资源

版主

沙发
 

pytorch确实是机器学习的核心,必须要把它学好

点评

是的,撸起袖子加油学  详情 回复 发表于 2024-7-18 19:58
 
 

回复

510

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
wangerxian 发表于 2024-7-18 17:20 pytorch确实是机器学习的核心,必须要把它学好

是的,撸起袖子加油学

 
个人签名

保持热爱

 
 

回复

419

帖子

0

TA的资源

纯净的硅(中级)

4
 

pytorch确实是机器学习的核心,必须要把它学好,加油,撸起袖子,甩开胳膊加油学!!!

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表