深度学习60分钟入门

来源于这里

本文目标:

  • 在高层次上理解PyTorch的Tensor库和神经网络
  • 训练一个小型的图形分类神经网络

本文示例运行在ipython中。

什么是PyTorch

PyTorch是由Torch7团队开发的,从名字就可以看出,它跟Torch的不同之处在于PyTorch使用了Python作为开发语言。所谓“Python first”,同样说明它是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速,同时还支持动态神经网络。

PyTorch既可以看做加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。

入门

Tensor(向量)

Tensor与NumPy的ndarras类似,此外Tensor还可用于GPU加速运算。

from __future__ import print_function
import torch

创建一个为初始化的5x3的矩阵:

x = torch.empty(5,3)
print(x)

输出:

tensor([[0.0000e+00, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, -0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00],
[1.4013e-45, 0.0000e+00, 0.0000e+00],
[0.0000e+00, 0.0000e+00, 0.0000e+00]])

创建一个随机初始化的矩阵:

x = torch.rand(5,3)
print(x)

输出:

tensor([[0.1633, 0.3415, 0.6341],
[0.9496, 0.6820, 0.7831],
[0.2327, 0.0311, 0.6763],
[0.5513, 0.6381, 0.1251],
[0.4553, 0.0795, 0.5904]])

创建一个由0填充,数据类型为long的矩阵:

x = torch.zeros(5,3,dtype=torch.long)
print(x)

输出:

tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])

由给定的数据直接创建一个Tensor:

x = torch.tensor([5.5,3])
print(x)

输出:

tensor([5.5000, 3.0000])

根据已存在的Tensor创建一个新的Tensor。除非用户提供新值,否则输入的Tensor的属性将被复用:

x = x.new_ones(5,3,dtype=torch.double)
print(x) x = torch.randn_like(x,dtype=torch.float)
print(x)

输出:

tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-1.2001, -0.3921, 1.1179],
[-1.5787, 0.4377, -0.2543],
[-0.2502, -0.4977, 1.1637],
[ 0.4006, 1.3536, 0.6846],
[-0.1242, 0.5019, -0.9795]])

获取大小:

print(x.size())

输出:

torch.Szie([5,3])

troch.Size实际是一个元组,所以支持元组的所有操作。

Operations(操作)

数学运算有多种语法。在下面的例子中,我们已加法运算为例。

加法:语法 1

y = torch.rand(5,3)
print('y = ',y)
print('x + y = ',x+y)

输出:

y =  tensor([[0.2520, 0.5938, 0.5229],
[0.1242, 0.9339, 0.4859],
[0.3769, 0.4005, 0.2906],
[0.4649, 0.2526, 0.7136],
[0.0941, 0.9550, 0.4462]])
x+y = tensor([[-0.9482, 0.2017, 1.6408],
[-1.4545, 1.3715, 0.2317],
[ 0.1268, -0.0973, 1.4543],
[ 0.8655, 1.6062, 1.3982],
[-0.0301, 1.4569, -0.5333]])

加法:语法 2

print('x+y = ',torch.add(x,y))

输出:

x+y =  tensor([[-0.9482,  0.2017,  1.6408],
[-1.4545, 1.3715, 0.2317],
[ 0.1268, -0.0973, 1.4543],
[ 0.8655, 1.6062, 1.3982],
[-0.0301, 1.4569, -0.5333]])

加法:提供一个输出的Tensor作为参数:

result = torch.empty(5,3)
torch.add(x,y,out=result)
print(result)

输出:

tensor([[-0.9482,  0.2017,  1.6408],
[-1.4545, 1.3715, 0.2317],
[ 0.1268, -0.0973, 1.4543],
[ 0.8655, 1.6062, 1.3982],
[-0.0301, 1.4569, -0.5333]])

加法:替代

y.add_(x)
print(y)

输出:

tensor([[-0.9482,  0.2017,  1.6408],
[-1.4545, 1.3715, 0.2317],
[ 0.1268, -0.0973, 1.4543],
[ 0.8655, 1.6062, 1.3982],
[-0.0301, 1.4569, -0.5333]])

任何替换原Tensor的操作都是以“_”为后缀的。例如 x.copy_(y),x.t_(),都会改变x

你可以使用标准的NumPy索引来获取元素:

print(x)
print(x[:,1])

输出:

tensor([[-1.2001, -0.3921,  1.1179],
[-1.5787, 0.4377, -0.2543],
[-0.2502, -0.4977, 1.1637],
[ 0.4006, 1.3536, 0.6846],
[-0.1242, 0.5019, -0.9795]])
tensor([-0.3921, 0.4377, -0.4977, 1.3536, 0.5019])

重置大小:如果你想改变Tensor的大小或者形状,你可以使用torch.view

x = torch.rand(4,4)
y = x.view(16)
z = x.view(-1,8) # -1为占位符,其大小是从其它维度推断出来的
print(x.size(),y.size(),z.size())
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

如果你的Tensor只有一个元素,那么可以使用.item()获取到Python数字类型的值:

x = torch.randn(1)
print(x)
print(x.item())

输出:

tensor([0.6787])
0.678749144077301

进阶阅读:

100+向量操作,包括转置、索引、切片、数学运算、线性代数、随机数等,详见这里

NumPy Bridge

将一个Torch Tensor转换成NumPy array是非常简单的,反之亦然。转换后的Torch Tensor和NumPy array共享底层的内存地址(如果Torch Tensor在CPU上),即修改一个,另一个也会改变。

将torch tensor转NumPy array
a = torch.ones(5)
print(a)

输出:

tensor([1., 1., 1., 1., 1.])
b = a.numpy()
print(b)

输出:

[1. 1. 1. 1. 1.]

tensor值改变,numpy array的值也改变:

a.add_(1)
print(a)
print(b)

输出:

tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
将NumPy array 转Torch tensor

接下来展示如何将NumPy array转换为 Torch tensor

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)

输出:

[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

除了CharTensor外,所有CPU上的Tensor都支持转成NumPy array并返回。

CUDA Tensors

Tensors可以使用.to方法移动到任何设备上。

# let us run this cell only if CUDA is available
# We will use ``torch.device`` objects to move tensors in and out of GPU
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA device object
y = torch.ones_like(x, device=device) # directly create a tensor on GPU
x = x.to(device) # or just use strings ``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!

输出:

tensor([2.0897], device='cuda:0')
tensor([2.0897], dtype=torch.float64)

[PyTorch入门之60分钟入门闪击战]之入门的更多相关文章

  1. [PyTorch入门之60分钟入门闪击战]之训练分类器

    训练分类器 目前为止,你已经知道如何定义神经网络.计算损失和更新网络的权重.现在你可能在想,那数据呢? What about data? 通常,当你需要处理图像.文本.音频或者视频数据时,你可以使用标 ...

  2. [PyTorch入门之60分钟入门闪击战]之神经网络

    神经网络 来源于这里. 神经网络可以使用torch.nn包构建. 现在你对autograd已经有了初步的了解,nn依赖于autograd定义模型并区分它们.一个nn.Module包含了层(layers ...

  3. [PyTorch入门之60分钟入门闪击战]之自动推倒

    AUTOGRAD: AUTOMATIC DIFFERENTIATION(自动分化) 来源于这里. autograd包是PyTorch中所有神经网络的核心.首先我们先简单地了解下它,然后我们将训练我们的 ...

  4. 【PyTorch深度学习60分钟快速入门 】Part4:训练一个分类器

      太棒啦!到目前为止,你已经了解了如何定义神经网络.计算损失,以及更新网络权重.不过,现在你可能会思考以下几个方面: 0x01 数据集 通常,当你需要处理图像.文本.音频或视频数据时,你可以使用标准 ...

  5. 【PyTorch深度学习60分钟快速入门 】Part0:系列介绍

      说明:本系列教程翻译自PyTorch官方教程<Deep Learning with PyTorch: A 60 Minute Blitz>,基于PyTorch 0.3.0.post4 ...

  6. 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化

      在本节中,我们将学习如何利用DataParallel使用多个GPU. 在PyTorch中使用多个GPU非常容易,你可以使用下面代码将模型放在GPU上: model.gpu() 然后,你可以将所有张 ...

  7. 【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分

      在PyTorch中,集中于所有神经网络的是autograd包.首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络. autograd包为张量的所有操作提供了自动微分.它是一个运行式定义的 ...

  8. 【PyTorch深度学习60分钟快速入门 】Part1:PyTorch是什么?

      0x00 PyTorch是什么? PyTorch是一个基于Python的科学计算工具包,它主要面向两种场景: 用于替代NumPy,可以使用GPU的计算力 一种深度学习研究平台,可以提供最大的灵活性 ...

  9. 【PyTorch深度学习60分钟快速入门 】Part3:神经网络

      神经网络可以通过使用torch.nn包来构建. 既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分.一个nn.Module包含多个网络层,以及一个返回输出的方法f ...

随机推荐

  1. python中的变量对象小结2

    # .变量名和数据内容是分开存储的. # .数据保存在内存中的一个位置(地址). # .变量中保存着数据在内存中的地址. # 引用就是变量中记录数据的地址. #不可变变量,重新赋值时会重新开辟一个地址 ...

  2. SLAM资料

    当下SLAM方案的总体介绍 http://wwwbuild.net/roboteasy/908066.html slam基础知识 https://www.zhihu.com/question/3518 ...

  3. Mac 终端实现快速定位命令 自动补全目录

    基于macOS oh-my-zsh 切换终端主题 incr.zsh 实现快速定位命令 自动补全目录 效果预览 步骤 1.安装 oh-my-zsh sh -c "$(curl -fsSL ht ...

  4. 日期控件 My97DatePicker WdatePicker 日期格式

    WdatePicker()只显示日期 WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})显示日期和时间 WdatePicker({dateFmt:'yyyy-MM ...

  5. selenium自学进度-2014.12.3

    今天把小米系列的视频看到了倒数第二课 他讲得很好,只是我现在是看第一遍,回头还需要照着视频多练练. 成长的道路问题艰辛的,学习的道路问题孤独的,希望自己能够坚持下去. 不要让今天的努力白费,不能让未来 ...

  6. python+selenium自动化--参数化(paramunittest)

    unnittest的参数化模块-paramunittest paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 两种用法 import unit ...

  7. Zabbix常用监控项整理

    zabbix常用key:http://blog.51cto.com/ttxsgoto/1771752 linux主机cpu使用率超过90%的时候报警:https://blog.csdn.net/reb ...

  8. python3.7解释器安装及配置虚拟环境

    目录 环境准备 一.开始安装解释器(安装很简单,直接上图) 二.配置pip工具下载源 安装虚拟环境 环境准备 1.Windows系统,本人是 Windows10专业版 2.python解释器安装包,本 ...

  9. MRP自动运算设置

    1.执行计划-删除老的调度计划: 2.运算日志-清除冲突: 3.MRP计划运算向导,清除预留: 4.创建MRP凌晨调度任务,名称自己修改: 5.创建完成: 6.设置消息通知:

  10. 什么是CDN

    1.什么是cdn    cdn全称是内容分发网络.其目的是让用户能够更快速的得到请求的数据.简单来讲,cdn就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据.举个例子,现在服务器 ...