【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

原文地址:https://www.cnblogs.com/leejack/p/8370634.html

时间: 2024-11-07 15:10:07

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

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

神经网络可以通过使用torch.nn包来构建. 既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分.一个nn.Module包含多个网络层,以及一个返回输出的方法forward(input) . 例如,查看下图中的对数字图片分类的网络: 这是一个简单的前馈网络.它接受输入,并将输入依次通过多个层,然后给出输出结果. 对于神经网络来说,一个经典的训练过程包括以下步骤: 定义一个包含一些可学习的参数(或权重)的神经网络 对输入数据集进行迭代 通过网络处理输入 计算损失

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

在PyTorch中,集中于所有神经网络的是autograd包.首先,我们简要地看一下此工具包,然后我们将训练第一个神经网络. autograd包为张量的所有操作提供了自动微分.它是一个运行式定义的框架,这意味着你的后向传播是由你的代码运行方式来定义的,并且每一个迭代都可以是不同的. 下面,让我们使用一些更简单的术语和例子来解释这个问题. 0x01 变量(Variable) autograd.Variable是autograd包的核心类,它封装了一个张量,并支持几乎所有在该张量上定义的操作.一旦完

pytorch深度学习60分钟闪电战

https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html 官方推荐的一篇教程 Tensors #Construct a 5x3 matrix, uninitialized: x = torch.empty(5, 3) #Construct a randomly initialized matrix: x = torch.rand(5, 3) # Construct a matrix filled zeros and

Vue.js 60 分钟快速入门

Vue.js 60 分钟快速入门 转载 作者:keepfool 链接:http://www.cnblogs.com/keepfool/p/5619070.html Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为V

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

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 本文摘自:http://www.cnblogs.com/keepfool/p/5619070.html 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将

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

Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将DOM和数据绑定起来.一旦你创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM

Vue.js——vue-router 60分钟快速入门

概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换. 本文将以示例的形式来介绍vue-router的各个特性,一共包含6个示例,每个示例都有乞丐版,前5个示例有皇帝版.乞丐版是将所有代码混杂在一起的HTML页面,皇帝版是基于vue

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

var vm = new Vue({ el: '#app', data: { people: [{ name: 'Jack', age: 30, sex: 'Male' }, { name: 'Bill', age: 26, sex: 'Male' }, { name: 'Tracy', age: 22, sex: 'Female' }, { name: 'Chris', age: 36, sex: 'Male' }] } }) </script> </html> 我们在选项对象的

Vue.js——vue-router 60分钟快速入门

概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用.vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换. 本文将以示例的形式来介绍vue-router的各个特性,一共包含6个示例,每个示例都有乞丐版,前5个示例有皇帝版.乞丐版是将所有代码混杂在一起的HTML页面,皇帝版是基于vue