https://github.com/chenyuntc/pytorch-book

Chapter2 :PyTorch快速入门 + Chapter3: Tensor和Autograd + Chapter4 : 神经网络工具箱nn

Tensor

  • 函数名后面带_的函数会修改Tensor本身,例如y.add_(x)会改变y.

  • tensor.numpy()和torch.from_numpy(ndarray)可以完成tensor和ndarray之间的转换.注意它们之间是共享内存的, 其中一个改变会导致另一个改变.但是如果两者的数据类型不一样时, 或者使用的是t.tensor(ndarray)进行转换, 会进行数据复制, 不会共享内存.

  • tensor[idx]得到的还是tensor,只有一个元素的tensor可以用tensor.item()取出其中的值.

  • 只有0-dim的tensor通常称为scalar, 例如tensor([1])是1-dim, tensor(1)是0-dim.

  • torch.中常用的创建tensor的方法包括tensor(), Tensor(), ones(), zeros(), arange(), randn(), randperm(), eye(), linspace().

  • torch.Tensor()是Python类, 生成的是torch.FloatTensor(), torch.tensor()是Python函数, 会从数据部分做拷贝, 根据原始数据类型生成相应的torch.LongTensor、torch.FloatTensor或torch.DoubleTensor. torch.Tensor([1])[0]等价于torch.tensor(1.0). 建议使用torch.tensor().

  • torch.Tensor()可以接受list, 可以指定形状, 可以传入其它tensor.它创建的tensor会在使用时才分配空间, 其它方法都是在创建时分配.

  • torch.tensor()会进行数据拷贝,新旧数据不共享内存;torch.detach()会共享内存.

  • 在对较大的tensor进行科学计算时, 养成向量化的思维习惯, 避免对较大的tensor进行逐元素遍历.

常用Tensor操作

  • tensor.size()等价于tensor.shape.

  • 一般通过以下代码将tensor转为GPU的tensor

    device = torch.device(“cuda:0” if torch.cuda.is_available() else “cpu”)
    x = x.to(device)
  • tensor.view()可以调整形状, 传入参数为-1时会自动计算剩余一个维度的所需大小.view()不会修改自身数据,返回的新tensor和源tensor共享内存.

  • tensor.unsqueeze()会在指定的维数增加一个tensor的维度.

  • tensor.squeeze()会在指定的维数压缩tensor的维度, 若不指定则压缩所有为1的维度.注意如果传入的维数不为“1”, 则不会进行压缩.

  • tensor支持索引操作, 索引结果通常和原tensor共享内存.可以用tensor[:, 0]的语法来指定第0列, 等价于tensor[:][0].

  • tensor[None]会为tensor新增一个轴.

  • tensor的索引支持传入BoolTensor, 例如a[a>1]等价于a.masked_select(a>1).

  • tensor.gather()可以指定dim和index, 输出tensor的形状与index相同, 并且是沿着dim的方向产生的.

  • 比较常用的tensor类型有FloatTensor和LongTensor, 可以通过type()或float()、long()等方法转换.

逐元素操作

  • 这部分操作会对tensor进行point-wise的操作, 输入与输出形状一致.

  • 运算操作, 例如abs(), sqrt(), div(), pow(), mul(), cos(), sin()等等.其中部分实现了运算符重载, 例如*, /, **.

  • 取整操作, 例如向上取整ceil(), 四舍五入round(), 向下取整floor(), 保留整数trunc(), 截断clamp(input, min, max).

  • 激活函数, 例如sigmoid(), tanh().

归并操作

  • 会使输出形状小于输入形状, 并且可以指定沿着某一维度进行操作.

  • 常见的有mean(), sum(), norm(), std()等.

比较

  • 大于小于等于之类的比较操作实现了运算符重载, 返回结果是BoolTensor.

  • max和min用于一个tensor时, 返回其中最大的数; 用于一个tensor和dim时, 返回最大元素的tensor和下标的tensor; 用于两个tensor时, 返回一个与它们形状相同的较大元素的tensor.

Autograd:自动微分

  • 只需设置tensor.requries_grad=True就可以使tensor使用autograd功能, 可以自动提供微分,从而实现反向传播求导.

  • grad在反向传播中是累加的, 所以每次运行反向传播前需要把梯度清零, 一般会使用optimizer.zero_grad()来清空.

  • PyTorch累加梯度的原因,一是增加了训练方式的自由, 二是可以减少内存消耗, 对于多任务中前面共享部分的tensor, 调用不同任务loss的backward会自动累加梯度.例如可以采用梯度累加方式进行训练, 多个batch后再更新一次网络参数, 变相实现了batchsize的扩大.

神经网络

  • torch.nn是专门为神经网络设计的模块化接口, 构建于autograd之上, 其中最重要的类是nn.Module, 是一个网络的封装, 包含各层定义和forward方法.

  • 定义网络时, 继承nn.Module, 并实现forward方法, 把具有可学习参数的层放在构造函数__init__中, 如果某一层不具有可学习参数, 一般不放在其中, 只在forward方法中用nn.functional写出.

  • nn.Module(input)等同于nn.Module.forward(input).在实际中应该尽量使用前者.

  • nn.Module子类的函数必须在构造函数中执行父类的构造函数, 即super(Net, self).__init__().

    import torch.nn as nn
    import torch.nn.functional as F class Net(nn.Module):
    def __init__(self):
    # nn.Module子类的函数必须在构造函数中执行父类的构造函数
    # 下式等价于nn.Module.__init__(self)
    super(Net, self).__init__() # 卷积层 '1'表示输入图片为单通道, '6'表示输出通道数,'5'表示卷积核为5*5
    self.conv1 = nn.Conv2d(1, 6, 5)
    # 卷积层
    self.conv2 = nn.Conv2d(6, 16, 5)
    # 仿射层/全连接层,y = Wx + b
    self.fc1 = nn.Linear(16*5*5, 120)
    self.fc2 = nn.Linear(120, 84)
    self.fc3 = nn.Linear(84, 10) def forward(self, x):
    # 卷积 -> 激活 -> 池化
    x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
    x = F.max_pool2d(F.relu(self.conv2(x)), 2)
    # reshape,‘-1’表示自适应
    x = x.view(x.size()[0], -1)
    x = F.relu(self.fc1(x))
    x = F.relu(self.fc2(x))
    x = self.fc3(x)
    return x net = Net()
    print(net)
  • 通过net.parameters()可以获得网络的可学习参数, net.named_parameters()可以获得网络的可学习参数及名称.
  • 前馈神经网络的forward函数有两种简化方式:Sequential可以包含几个子Module,ModuleList是Module的子类,可以用在Module中,类似于list.
    net1 = nn.Sequential(
    nn.Conv2d(3,3,3),
    nn.BatchNorm(3),
    nn.ReLU()
    ) class MyModule(nn.Module):
    def __init__(self):
    super(MyModule, self).__init__()
    self.module_list = nn.ModuleLIst([nn.Conv2d(3,3,3), nn.ReLU()])
    def forward(self):
    pass
  • torch.nn只支持mini-batches, 如果想一次只输入一个样本, 需要用input.unsqueeze(0)将batch_size设置为1.

  • PyTorch实现了最常用的三种RNN和对应的RNNCell: RNN、LSTM、GRU. 前者一次能够处理整个序列, 后者一次只处理序列中一个时间点的数据.

  • PyTorch还提供了用于词向量的Embedding层, 例如4个词, 每个词有5维可以如下表示embedding = nn.Embedding(4, 5), 会随机初始化一个0-index的4*5的二维表,其中存储了每个词的词向量. 也可以用预训练好的词向量初始化embedding.

  • 对于batchnorm、dropout等训练和测试阶段行为不同的层, 推荐用module.train()和module.eval()来设置它们的training属性.

  • 所有的Module对象都具有state_dict()函数,可以使用torch.save(net.state_dict(), 'net.pth')和net.load_state_dict(torch.load('net.pth'))来保存和载入模型.

  • 多GPU并行运算的方式有两种, nn.parallel.data_parallel会利用多GPU并行计算出结果, nn.DataParallel会返回一个能自动在多GPU上并行计算的模型.

损失函数

  • torch.nn实现了大多数损失函数,例如nn.MSELoss, nn.CrossEntropyLoss.

  • 一般用法是criterion = nn.LossFunc(), loss = criterion(output, target).

  • 当计算出loss后, 就可以清空梯度, 进行反向传播, 此时网络参数的梯度就计算完成.

优化器

  • torch.optim实现了大多数优化方法, 例如RMSProp, Adam, SGD.

  • optimizer可以通过名字,为不同子网络或不同层指定不同的学习率.调整学习率可以通过修改optimizer.param_groups中对应的学习率实现, 也可以直接新建优化器.后者较简单也较推荐, 缺点是会丢失Adam等算法中的动量信息.

  • 在反向传播完成后, 通过optimizer.step()就可以更新权重和参数.

    for epoch in range(num_epoches):
    running_loss = 0
    for i,(images,target) in enumerate(train_loader):
    # 1. input output
    images = images.cuda(non_blocking=True)
    target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)
    outputs = model(images)
    loss = criterion(outputs,target) # 2. backward
    optimizer = optim.SGD(model.parameters())
    optimizer.zero_grad() # reset gradient
    loss.backward()
    optimizer.step()
    running_loss += loss.item()
    print('running_loss : ', running_loss)
    running_loss = 0.0

Chapter5 : PyTorch常用工具模块

数据加载与预处理

  • 一般使用torchvision来对数据进行加载与预处理.

  • torch.transforms可以用来定义预处理器, 例如transforms.Compose()可以将转换为Tensor、归一化等流程结合起来.

  • torch.utils.data.Dataloader()是一个可迭代对象, 将dataset返回的数据拼接为一个batch, 并提供多线程加速、shuffle等操作.

  • 在测试的时候不需要求导, 可以把评估代码写在with torch.no_grad()代码段下面, 提高速度.

《深度学习框架PyTorch:入门与实践》读书笔记的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. SpringCloud入门概述

    SpringCloud入门概述 Spring的三大模块:SpringBoot(构建),Spring Cloud(协调),Spring Cloud Data Flow(连接)注意:Spring Boot ...

  2. 通过消息总线Spring Cloud Bus实现配置文件刷新(使用Kafka或RocketMQ)

    如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了.使用 ...

  3. 极简 Spring Boot 整合 Thymeleaf 页面模板

    虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板(实际上,即使前后端分离,也会在一些场景下需要使用页面模板, ...

  4. 一个小巧,也很nice的“小日历”--一个Android App

    一个小巧也很Nice的“小日历” 背景 因为,常用日历记一些事情,Android自带的日历,如果有事情,会显示一个小点,然后点击进去后才能看到事情的具体内容,不是很方便. 所以,写了一个“小日历” 特 ...

  5. 《 .NET并发编程实战》阅读指南 - 第11章

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  6. Razor Page中的AJAX

    1.由于Razor Pages自带提供防伪令牌/验证,用来防止跨站点请求伪造(称为XSRF或CSRF),所以和MVC框架中API使用方式有稍许的不同. 2.所以在我们使用Razor Pages中的fo ...

  7. 【翻译】Dockerfile参考

    Dockerfile参考 来自docker官方网址:https://docs.docker.com/engine/reference/builder/ docker能够从Dockerfile中读取指令 ...

  8. json传的解析,二维数据解析

    下载地址:https://share.weiyun.com/447eda75fdd46cb87f6622ecdce4c3ac

  9. css flex兼容性

    我测试了一下css flex的兼容性 已经可以兼容到IE10了呀 为啥MDN上面的IE兼容性还是兼容到IE11 有点更新不及时的感觉

  10. Odoo treeView列表视图详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826414.html TreeView:列表视图 1:<tree>标签的属性 [tree标签内 ...