0x00 PyTorch是什么?

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

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

0x01 开始学习

1、Tensors

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

from __future__ import print_function
import torch

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

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

输出结果:

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

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

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

输出结果:

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

获取矩阵大小:

print(x.size())

输出结果:

torch.Size([5, 3])

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

2、操作

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

(1)加法:语法1

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

输出结果:

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

(2)加法:语法2

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

输出结果:

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

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

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

输出结果:

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

(4)加法:原地替换

# adds x to y
y.add_(x)
print(y)

输出结果:

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

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

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

print(x[:, 1])

输出结果:

 0.8026
0.8763
0.0675
0.1499
0.8487
[torch.FloatTensor of size 5]

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

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

输出结果:

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

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

0x02 NumPy转换

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

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

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

定义一个torch张量对象:

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

输出结果:

 1
1
1
1
1
[torch.FloatTensor of size 5]

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

b = a.numpy()
print(b)

输出结果:

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

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

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

输出结果:

 2
2
2
2
2
[torch.FloatTensor of size 5] [ 2. 2. 2. 2. 2.]

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

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

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.]

 2
2
2
2
2
[torch.DoubleTensor of size 5]

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

0x03 CUDA张量

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

# 只有当CUDA可用时才会进行下面计算
if torch.cuda.is_available():
x = x.cuda()
y = y.cuda()
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. linux svnserver的安装使用备用

    先说一下初弄者的误区,svn上传到svnserver的文件是变化了的,会被打包加入svn的版本库里边一般存在db 文件下 每次提交会生成0,1,2 这样排序的文件,在  /var/svn/apple/ ...

  2. mysql找到数据的存储位置

    本来是想找mysql数据库文件中的sql脚本文件的,结果发现运行了sql脚本文件后,你删除了,就没有sql语句了,那么我们分析一下在数据库路径下面找到的文件又是什么呢? 1.先找mysql中data的 ...

  3. 主机性能监控之wmi 获取磁盘信息

    标 题: 主机性能监控之wmi 获取磁盘信息作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990541.html 欢迎转帖 请保持文本完整并注明出处 仅 ...

  4. 79、iOS 的Cocoa框架、Foundation框架以及UIKit框架

    Cocoa框架是iOS应用程序的基础 1. Cocoa是什么? Cocoa是 OS X和ios 操作系统的程序的运行环境. 是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发 ...

  5. OpenCV图像分割1

    1.基于阈值 1.1原理 灰度阈值化,假设输入图像为f,输出图像为g,则阈值化公式如下: g(i,j)=1  当f(i,j)>=T g(i,j)=0 当f(i,j)<T 1.2适用范围 当 ...

  6. lwip-动态内存管理

    动态内存管理涉及两类重要函数,内存分配函数,内存释放函数,如C语言中的malloc和free. 内存分配的本质是:在事先准好一大块内存堆(可以理解为一个很大的数组)中分配合适的空间,然后将该空间起始地 ...

  7. HDU 1171 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 基础的01背包,求出总值sum,背包体积即为sum/2 #include<stdio.h> # ...

  8. ubuntu16.04下使用navicat连接docker mysql5.7.20

    摘要: 本文将介绍如何使用docker创建mysql容器,并使用navicat连接该mysql服务,最后提供一个navicat中文乱码问题的解决方案. docker的安装和使用在这里不再赘述,如果不是 ...

  9. Python 绝技 —— UDP 服务器与客户端

    i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 —— TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演 ...

  10. SVN 客户端 TortoiseSVN 的安装和使用

    关于 参考博客:TortoiseSVN新人使用指南 TortoiseSVN 是一个 Apache Subversion(SVN)客户端,实现为Windows外壳扩展.它直观且易于使用,因为它不需要Su ...