【PyTorch深度学习60分钟快速入门 】Part1:PyTorch是什么?
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是什么?的更多相关文章
- 【PyTorch深度学习60分钟快速入门 】Part4:训练一个分类器
太棒啦!到目前为止,你已经了解了如何定义神经网络.计算损失,以及更新网络权重.不过,现在你可能会思考以下几个方面: 0x01 数据集 通常,当你需要处理图像.文本.音频或视频数据时,你可以使用标准 ...
- 【PyTorch深度学习60分钟快速入门 】Part5:数据并行化
在本节中,我们将学习如何利用DataParallel使用多个GPU. 在PyTorch中使用多个GPU非常容易,你可以使用下面代码将模型放在GPU上: model.gpu() 然后,你可以将所有张 ...
- 【PyTorch深度学习60分钟快速入门 】Part3:神经网络
神经网络可以通过使用torch.nn包来构建. 既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分.一个nn.Module包含多个网络层,以及一个返回输出的方法f ...
- 【PyTorch深度学习60分钟快速入门 】Part0:系列介绍
说明:本系列教程翻译自PyTorch官方教程<Deep Learning with PyTorch: A 60 Minute Blitz>,基于PyTorch 0.3.0.post4 ...
- 【PyTorch深度学习60分钟快速入门 】Part2:Autograd自动化微分
在PyTorch中,集中于所有神经网络的是autograd包.首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络. autograd包为张量的所有操作提供了自动微分.它是一个运行式定义的 ...
- pytorch深度学习60分钟闪电战
https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 官方推荐的一篇教程 Tensors #Construct a ...
- Vue.js 60 分钟快速入门
Vue.js 60 分钟快速入门 转载 作者:keepfool 链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下 ...
- 不会几个框架,都不好意思说搞过前端: Vue.js - 60分钟快速入门
Vue.js——60分钟快速入门 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理 ...
- Vue.js——60分钟快速入门(转)
vue:Vue.js——60分钟快速入门 <!doctype html> <html lang="en"> <head> <meta ch ...
随机推荐
- Knockout.js组件系统的详解之(一) - 组件的定义和注册
(Knockout版本:3.4.1 ) KO的组件主要从以下四个部分进行详细介绍: 1.组件的定义和注册 2.组件绑定 3.使用自定义元素 4.自定义组件加载器(高级) 目录结构 1.通过" ...
- Linux下强制杀死进程的方法
常规篇: 首先,用ps查看进程,方法如下: $ ps -ef …… smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal smx 1823 1822 0 11:38 ...
- js-function复制变量值和传递参数
<title>function复制变量值</title></head><body> <script> var a={ num:10 } // ...
- 171. Excel表列序号
题目:给定一个Excel表格中的列名称,返回其相应的列序号. 例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> ...
- ubuntu下chrome浏览器安装flash插件(pepperflashplugin-nonfree)
安装前说明: ubuntu的Google 已经不能使用Adobe Flash了,需要用PepperFlashPlayer来替代 Adobe Flash才行. 安装步骤: 1.安装pepperflash ...
- JQuery Mobile - 固定住页面和页脚
在点击页面空白时候,页眉和页脚会隐藏,在页眉和页脚加入以下代码就可以了: data-tap-toggle ="false" 例子: <div data-role=" ...
- 2018/7/26号碰到了个奇怪的问题(http有问题,但是ftp没毛病)
过程大概是这样的 本来测试服务器中发ajax没问题,突然暴毙了,服务器又通过ajax发了另外一个请求(与之前不一样). nginx reload 没毛病 ,ftp 也使用正常. 出了什么问题呢? ...
- Mac OS 中安装 autoconf 和 automake
在Mac上面编译FFmpeg需要安装很多东西,首先是:autoconf 和 automake 请按照以下顺序安装: curl -O http://mirrors.kernel.org/gnu/m4/m ...
- Android NDK学习(三):Hello World
版权声明:转载请说明出处:http://www.cnblogs.com/renhui/p/6925810.html 首先编写Jni接口的c文件,此文件命名有些特殊,具体的命名方式可以参考文档来做. # ...
- Android 经验之文件下载
在Android 开发中,我们肯定会接触到下载需求,那么如何通过技术实现呢? 一.简单实现: 通过了解HTTP原理,我们应该可以知道,HTTP学习的时候,可以通过HTTPGET方式来进行文件下载: n ...