0x00 PyTorch是什么?

PyTorch是一个基于Python的科学计算工具包,它主要面向两种场景:

  • 用于替代NumPy,可以使用GPU的计算力
  • 一种深度学习研究平台,可以提供最大的灵活性和速度

0x01 开始学习

1、Tensors

Tensors(张量)类似于numpy的ndarrays,不过Tensors还可以运行于GPU上以提升计算速度。

  1. from __future__ import print_function
  2. import torch

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

  1. x = torch.Tensor(5, 3)
  2. print(x)

输出结果:

  1. 0.0000e+00 0.0000e+00 3.1766e-27
  2. 4.5880e-41 3.1950e-27 4.5880e-41
  3. 1.9468e-22 4.5880e-41 1.9468e-22
  4. 4.5880e-41 2.3214e-22 4.5880e-41
  5. 2.2306e-22 4.5880e-41 -2.7458e+32
  6. [torch.FloatTensor of size 5x3]

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

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

输出结果:

  1. 0.9559 0.8026 0.4142
  2. 0.8142 0.8763 0.6700
  3. 0.4673 0.0675 0.3439
  4. 0.2200 0.1499 0.6082
  5. 0.7853 0.8487 0.8124
  6. [torch.FloatTensor of size 5x3]

获取矩阵大小:

  1. print(x.size())

输出结果:

  1. torch.Size([5, 3])

注意:torch.Size实际上是一个元组,所以它支持元组的所有操作。

2、操作

PyTorch中的操作有很多不同的语法,下面我们以加法为例来学习其操作语法:

(1)加法:语法1

  1. y = torch.rand(5, 3)
  2. print(x + y) # x为上文中定义的x

输出结果:

  1. 1.7700 1.7643 1.3732
  2. 1.3085 1.4576 0.9668
  3. 0.9354 0.0891 0.4727
  4. 0.6503 0.6814 1.2334
  5. 1.5436 0.9600 1.0965
  6. [torch.FloatTensor of size 5x3]

(2)加法:语法2

  1. print(torch.add(x, y)) # x为上文中定义的x

输出结果:

  1. 1.7700 1.7643 1.3732
  2. 1.3085 1.4576 0.9668
  3. 0.9354 0.0891 0.4727
  4. 0.6503 0.6814 1.2334
  5. 1.5436 0.9600 1.0965
  6. [torch.FloatTensor of size 5x3]

(3)加法:将结果赋值给Tensor对象

  1. result = torch.Tensor(5, 3)
  2. torch.add(x, y, out=result)
  3. print(result)

输出结果:

  1. 1.7700 1.7643 1.3732
  2. 1.3085 1.4576 0.9668
  3. 0.9354 0.0891 0.4727
  4. 0.6503 0.6814 1.2334
  5. 1.5436 0.9600 1.0965
  6. [torch.FloatTensor of size 5x3]

(4)加法:原地替换

  1. # adds x to y
  2. y.add_(x)
  3. print(y)

输出结果:

  1. 1.7700 1.7643 1.3732
  2. 1.3085 1.4576 0.9668
  3. 0.9354 0.0891 0.4727
  4. 0.6503 0.6814 1.2334
  5. 1.5436 0.9600 1.0965
  6. [torch.FloatTensor of size 5x3]

注意: 任何原地改变张量值的操作后缀都是固定的_,例如:x.copy_(y)x.t_(),都将原地改变x的值。

另外,你可以使用标准的numpy索引来操作Tensor对象。

  1. print(x[:, 1])

输出结果:

  1. 0.8026
  2. 0.8763
  3. 0.0675
  4. 0.1499
  5. 0.8487
  6. [torch.FloatTensor of size 5]

调整大小:如果你想调整或重塑张量形状,那么可以使用torch.view

  1. x = torch.randn(4, 4)
  2. y = x.view(16)
  3. z = x.view(-1, 8) # the size -1 is inferred from other dimensions
  4. print(x.size(), y.size(), z.size())

输出结果:

  1. torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

扩展阅读: 这里介绍了超过100个Tensor操作,包括转置、索引、切片、数学操作、线性代数、随机数等。

0x02 NumPy转换

将torch中的张量转换为numpy中的数组或者反过来都是轻而易举的事。

torch张量与numpy数组将共享它们底层的内存位置,改变二者之一都将会改变另一个。

1、将torch张量转换为numpy数组

定义一个torch张量对象:

  1. a = torch.ones(5)
  2. print(a)

输出结果:

  1. 1
  2. 1
  3. 1
  4. 1
  5. 1
  6. [torch.FloatTensor of size 5]

将torch张量对象转换为numpy中的数组对象:

  1. b = a.numpy()
  2. print(b)

输出结果:

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

下面查看numpy数组值是如何变化的:

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

输出结果:

  1. 2
  2. 2
  3. 2
  4. 2
  5. 2
  6. [torch.FloatTensor of size 5]
  7. [ 2. 2. 2. 2. 2.]

2、将numpy数组转换为torch张量

下面查看修改numpy数组是如何自动改变torch张量的:

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

输出结果:

  1. [ 2. 2. 2. 2. 2.]
  2. 2
  3. 2
  4. 2
  5. 2
  6. 2
  7. [torch.DoubleTensor of size 5]

在CPU上的所有的张量,除了CharTensor之外,都支持转换成NumPy对象,也支持反向转换。

0x03 CUDA张量

使用.cuda函数可以将张量移到GPU上进行计算:

  1. # 只有当CUDA可用时才会进行下面计算
  2. if torch.cuda.is_available():
  3. x = x.cuda()
  4. y = y.cuda()
  5. x + y

以上脚本的总运行时间为:0分0.132秒。

 

本文中所使用的Python代码: tensor_tutorial.py

【PyTorch深度学习60分钟快速入门 】Part1:PyTorch是什么?的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. pytorch深度学习60分钟闪电战

    https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 官方推荐的一篇教程 Tensors #Construct a ...

  7. Vue.js 60 分钟快速入门

    Vue.js 60 分钟快速入门 转载 作者:keepfool 链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下 ...

  8. 不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门

    Vue.js——60分钟快速入门   Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理 ...

  9. Vue.js——60分钟快速入门(转)

    vue:Vue.js——60分钟快速入门 <!doctype html> <html lang="en"> <head> <meta ch ...

随机推荐

  1. JMD Handy Baby 2 to Decode & Adding New BMW 525 ID46 Key

    Here OBD2TOOL share the guide on how to use JMD Handy Baby II to decode and add new keys for BMW 525 ...

  2. Linux 使用 mail 发送邮件

    ubuntu 需要安装 mailutils sudo apt-get install mailutils

  3. @Scheduler与cron

  4. java28

    1.使用多态的优点 把要创建的多个子类缩减为一个父类接着传入参数,用参数调用子类的方法, 输出时直接调用父类的方法,这时传参传创建的对象 2.多态方法的调用 调用的方法前有static时,会默认调用父 ...

  5. 学习Acegi应用到实际项目中(5)

    实际企业应用中,用户密码一般都会进行加密处理,这样才能使企业应用更加安全.既然密码的加密如此之重要,那么Acegi(Spring Security)作为成熟的安全框架,当然也我们提供了相应的处理方式. ...

  6. 【转】Closeable, Readable, Flushable, Appendable

    Closeable: package java.io; import java.io.IOException; public interface Closeable { /** * Closes th ...

  7. Chrome浏览器用AdBlockPlus拦截百度广告

    一:安装AdBlockPlus插件,这个貌似要FQ安装,不知道可不可以本地安装: 二:在右侧的扩展那里找到ABP扩展,然后设置-高级-我的过滤列表栏-开始创建我的过滤列表: 三:在列表栏里添加 bai ...

  8. python实战提升--1

    #python实战提升 1. 如何在列表.字典.集合中根据条件筛选数据? python中for _ in range(10)与for i in range(10)有何区别 下划线表示 临时变量, 仅用 ...

  9. CentOS配置多公网

      最终目标是同一台服务器可以多个IP地址共同访问,在这个前提下又有如下两种方式: 多个公网IP使用同一个网关 多个公网IP使用不同网关   这两种方式区别所在:1.多个公网IP使用同一个网关,我们只 ...

  10. 一个简单的将Markdown二级标题进行排序的脚本

    我在写博客<Linux的1000个命令>的时候,相对二级标题进行一下排序,方便阅读和查找,于是就有了这个小程序. #! /usr/bin/env python3 import os imp ...