pytorch 入门指南

两类深度学习框架的优缺点

动态图(PyTorch)
计算图的进行与代码的运行时同时进行的。
静态图(Tensorflow <2.0)

自建命名体系
自建时序控制
难以介入

使用深度学习框架的优点

GPU 加速  (cuda)
自动求导
常用网络层的API

PyTorch 的特点

支持 GPU
动态神经网络
Python 优先
命令式体验
轻松扩展
1.Pytorch简介
Pytorch是Facebook 的 AI 研究团队发布了一个基于 Python的科学计算包,旨在服务两类场合:

替代numpy发挥GPU潜能(在线环境暂时不支持GPU)
一个提供了高度灵活性和效率的深度学习实验性平台
2.Pytorch特点及优势
2.1 Pytorch特点
PyTorch 提供了运行在 GPU/CPU 之上、基础的张量操作库;
可以内置的神经网络库;
提供模型训练功能;
支持共享内存的多进程并发(multiprocessing )库等;
2.2 Pytorch特点
处于机器学习第一大语言 Python 的生态圈之中,使得开发者能使用广大的 Python 库和软件;如 NumPy、SciPy 和 Cython(为了速度把 Python 编译成 C 语言);
(最大优势)改进现有的神经网络,提供了更快速的方法——不需要从头重新构建整个网络,这是由于 PyTorch 采用了动态计算图(dynamic computational graph)结构,而不是大多数开源框架(TensorFlow、Caffe、CNTK、Theano 等)采用的静态计算图;
提供工具包,如torch 、torch.nn、torch.optim等;
3.Pytorch常用工具包
torch :类似 NumPy 的张量库,强 GPU 支持 ;
torch.autograd :基于 tape 的自动区别库,支持 torch 之中的所有可区分张量运行;
torch.nn :为最大化灵活性未涉及、与 autograd 深度整合的神经网络库;
torch.optim:与 torch.nn 一起使用的优化包,包含 SGD、RMSProp、LBFGS、Adam 等标准优化方式;
torch.multiprocessing: python 多进程并发,进程之间 torch Tensors 的内存共享;
torch.utils:数据载入器。具有训练器和其他便利功能;
torch.legacy(.nn/.optim) :处于向后兼容性考虑,从 Torch 移植来的 legacy 代码;

1. pytorch 概述

pytorch是facebook 开发的torch(Lua语言)的python版本,于2017年引爆学术界
官方宣传pytorch侧重两类用户:numpy的gpu版、深度学习研究平台
pytorch使用动态图机制,相比于tensorflow最开始的静态图,更为灵活
当前pytorch支持的系统包括:win,linux,macos

2. pytorch基本库

常用的pytorch基本库主要包括:

torch: 内含一些常用方法,与numpy比较像
torch.Tensor:内含一些操作tensor的方法,可通过tensor.xx()进行调用
torch.nn:内含一些常用模型,如rnn,cnn等
torch.nn.functional:内含一些常用方法,如sigmoid,softmax等
torch.optim:内含一些优化算法,如sgd,adam等
torch.utils.data:内含一些数据迭代方法

3. 基本操作

a. tensor操作

# 初始化空向量
torch.empty(3,4)

# 随机初始化数组
torch.rand(4,3)

# 初始化零向量
torch.zeros(4,3, dtype=torch.int)

# 从数据构建数组
x = torch.tensor([3,4],dtype=torch.float)
x = torch.IntTensor([3,4])

# 获取tensor的尺寸,元组
x.shape
x.size()

# _在方法中的意义:表示对自身的改变
x = torch.ones(3,4)
# 以下三个式子 含义相同
x = x + x
x = torch.add(x, x)
x.add_(x)

# 索引,像操作numpy一样
x[:,1]

# 改变形状
x.view(-1)
x.view(4,3)

# 如果只包含一个元素值,获取
x = torch.randn(1)
x.item()

# 增加一维
input = torch.randn(32, 32)
input = input.unsqueeze(0)
input.size()

# tensor的data还是tensor,但是requires_grad=False
x.data.requires_grad

# 改变类型
x.type(torch.LongTensor)123456789101112131415161718192021222324252627282930313233343536373839404142434445

b. numpy 与 tensor的转换

# 转换, 共享内存
a= numpy.array([1,2,3])
a = torch.from_numpy(a)
a.numpy()1234

c. 调用gpu

# gpu是否可用
torch.cuda.is_available()
# 调用设备
device = torch.device(‘cpu‘) # cuda or cpu
a = torch.tensor([1,2,3], device=‘cuda‘)  # 直接在gpu上创建
a = a.to(device) # 上传
a = a.to(‘cpu‘) # 上传, cpu or cuda
a = a.cuda()  # 上传cuda12345678

d. 梯度

.requires_grad ,决定是否可微(梯度)
.backward(), 计算梯度;如果单独一个值则不需指定参数,否则需传入权重(尺寸与tensor的size同)
.grad, 用于存储梯度累计值。 只有tensor有梯度值,计算节点没有
.detach(), 相当于新建了一个变量,历史的计算图无效
with torch.no_grad():, 评估模型时可用到,不计算梯度
.grad_fn, 节点是如何产生的;用户创造的tensor([1,2,3]).grad_fn 为None
.data(), tensor值,requires_grad=False

# 创建可微的tensor
x = torch.ones(2,3,requires_grad=True)

# 改变可微性
x.requires_grad_(False)

# 获得梯度值
x = torch.ones(2, 2, requires_grad=True)
y = x +2
z = y * y *3
out = torch.sum(z)
out.backward()
x.grad

# 无梯度, 报错
with torch.no_grad():
    x = torch.ones(2, 2, requires_grad=True)
    y = x +2
    z = y * y *3
    out = torch.sum(z)
    out.backward()
    x.grad12345678910111213141516171819202122

e. 定义模型

两种定义方式

class定义
Sequential定义

# 通过class定义
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 下面通过实例变量的形式声明模型内需要学习的参数
        self.fc1 = nn.Linear(5, 10)
        self.fc2 = nn.Linear(10,20)

def forward(self, x):
        # 下面定义计算图
        x = self.fc1(x)
        x = nn.functional.relu(x)
        x = self.fc2(x)
        return x
net = Net()

# 通过Sequential定义
net = Sequential(
    nn.Linear(5, 10),
    nn.Relu(),
    nn.Linear(10, 20)
)12345678910111213141516171819202122

f. 模型参数操作

# 获取模型参数
net.parameters() #可用for 迭代

# 模型内参数梯度清零
net.zero_grad()12345

g. 定义损失函数

loss = nn.CrossEntropyLoss()1

h. 定义优化算子

optimizer = optim.SGD(net.parameters(), lr=0.01)1

i. 训练

optimizer.zero_grad()   # zero the gradient buffers
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step() 12345

j. 测试

# 测试
with torch.no_grad():
    output = net(input)123

k. 保存与载入

# 模型
torch.save(net, file)
net = torch.load(file)

# 参数
torch.save(model.state_dict(), file)
net = Model()
net.load_state_dict(file)12345678

4. 一个完整的机器学习流程

数据
载入数据
数据处理
构建迭代器
模型
loss
optimizer
新建/载入模型
新建
载入
直接载入模型
载入参数
新建模型
载入模型参数(对于adam等优化器,其参数也需载入)
训练

batch训练

for i, batch in enumerate(dataloader):
     x_batch, y_batch = batch
     outputs = net(x_batch)
     loss = criterion(output, target)
     optimizer.zero_grad()
     loss.backward()
     optimizer.step()1234567
每隔一段时间,打印验证集loss
每隔一段时间,存储模型
测试

载入测试数据
数据处理
构建迭代器(可选)
放入模型,输出结果
计算accuracy

原文地址:https://www.cnblogs.com/henuliulei/p/11401865.html

时间: 2024-07-30 21:17:17

pytorch 入门指南的相关文章

Quartz.NET简介及入门指南

Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAVA开源调度框架 Quartz 的移植. 入门指南 本入门指南包括以下内容: 下载 Quartz.NET 安装 Quartz.NET 根据你的特定项目配置 Quartz 启动一个样例程序 下载和安装 你可以下载 zip 文件或使用 Nuget 程序包.Nuget 程序包只包含 Quartz.NET 运

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

【翻译Autofac的帮助文档】1.入门指南

[写在前面]尝试做完一件工作之外自我觉得有意义的一件事,那就从翻译Autofac的帮助文档吧. 入门指南 将Autofac集成你的应用程序的步骤通常很简单,一般是: 时刻以IOC(控制反转)的思想来规划你的应用程序 在你的Porject中添加Autofac引用 按照如下步骤设计应用程序的启动环节 创建一个ContainerBuilder 向ContainerBuilder注册组件 通过ContainerBuilder的Build()方法获得Container(后续需用到) 在应用程序运行环节时,

Markdown——入门指南

导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不超过十个,这种相对于更为复杂的 HTML 标记语言来说,Markdown 可谓是十分轻量的,学习成本也不需要太多,且一旦熟悉这种语法规则,会有一劳永逸的效果. Ulysses for Mac 一,认识 Markdown 在刚才的导语里提到,Markdown 是一种用来写作的轻量级「标记语言」

Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译

入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何可以连接API的语言,包括Java.Assembly和Visual Basic:我不会向你呈现任何跟这些语言相关的代码,这需要你在本教程的指导下自己去完成,有一些人在本API的基础上使用其他语言进行编程取得了相当的成功. 本教程不会教你C语言,也不会告诉你怎样去运行你特定的编译器(Borland C

[转载]TFS入门指南

[原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本月初,我们发布了TFS新基础配置.该配置为建立支持源码管理,工作项和生成(builds)的TFS版本提供了便利. 这是一个好机会将你在VSS(Visual Source Safe)上的资源迁移到TFS,并且还可以选用一些新的特性.现在VS2010 Beta2的正式版已经发布了,下面是该系统的入门指南

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,

物联网操作系统HelloX开发者入门指南

HelloX开发者入门指南 HelloX是聚焦于物联网领域的操作系统开发项目,可以通过百度搜索"HelloX",获取详细信息.当前开发团队正在进一步招募中,欢迎您的了解和加入.如果您希望加入HelloX的开发团队,建议参照下列步骤进行操作: 1.      首先,请亲手熟悉和操作HelloX操作系统,这是我们开发的核心组件之一,所有其它组件(包括后台组件,终端产品等)都围绕HelloX操作系统展开.这一步很容易操作,请从github(github.com/hellox-project/

STM32F10X入门指南---AD转换

首先,点击下面的链接下载我们需要使用的代码.链接 1.添加必要的文件: 之前我们说过,有三个文件是必须添加的,这三个文件分别是:startup_stm32f10x_xd.s ,stm32f10x_rcc.c ,system_stm32f10x.c.其中,前面的xd是根据你的芯片的容量来选择的.这三个文件都可以在千帆提供的代码中找到.文件路径:Core.rar\Core\STM32\Source\Must . 另外,如果想操作IO口,必须添加千帆的一个库文件DeviceBase.cpp.文件路径: