🇨🇳
阿臻的学习笔记
  • 🤖AI
    • 📑README
    • 🕒Scheduling
      • 一种JSSP的DRL环境
    • 📜Paper
      • 神经协同过滤
      • 非侵入信号深度学习
      • 肾透析移植机器学习
      • 心理学随机森林
      • P300数据学习
    • ⚒️Pytorch
      • 1.1数据基础
      • 1.2自动梯度
      • 1.3神经网络
      • 1.4模型实现
      • 2数据操作
    • 🛠️Ray+Gym
    • 📃Graph Neural
      • 图神经网络基础
      • Contrastive Multi-View Representation Learning on Graphs
    • 📽️Deep Learning
      • 《第一章》
      • 《第二章》
      • 《第三章》
      • 《第四章》
      • 台湾陈蕴侬视频2020
    • 🔨MXNet
      • 《第一章》《第二章》
      • 《第三章》
      • 《第四章》
      • 《第五章》
      • 《第六章》
      • 《第七章》
      • 《第八章》
      • 《第九章》
      • 《第十章》
  • 👨‍🏭Study
    • 📔Algorithm
      • Leetcode
        • 第一天(乱刷)
        • 第二天(栈)
        • 第三天(栈)
        • 第四天(堆)(贪心)
        • 第五天(贪心)
        • 第六天(贪心)
        • 第七天(排序)
        • 第八天(排序)
        • 第九天(排序)
        • 第十天(位运算)
        • 第十一天(位运算)
        • 第十二天(位运算)
        • 第十三天(位运算)
        • 第十四天(树)
        • 第十五天(树)
        • 第十六天(树)
        • 第十七天(树)
        • 第十八天(树)
        • 第十九天(树)
        • 第二十天(树)
        • 第二十一天(树)
        • 第二十二天(并查集)
        • 第二十三天(并查集)
        • 第二十四天(DFS)(图)
        • 第二十五天(图)(设计)
        • 第二十六天(拓扑)
        • 第二十七天(字典树)
        • 第二十八天(字典树)
        • 第二十九天(树状数组)(二叉搜索树)
        • 第三十天(递归)
        • 第三十一天(脑筋急转弯)
        • 第三十二天(脑筋急转弯)
        • 第三十三天(记忆化)
        • 第三十四天(队列)
        • 第三十五天(队列)
        • 第三十六天(极小化极大)
        • 第三十七天(几何)
        • 第三十八天(蓄水池抽样)
        • 第三十九天(数组)
        • 第四十天(数组)
        • 第四十一天(数组)
        • 第四十二天(数组)
        • 第四十三天(数组)
        • 第四十四天(数组)
        • 第四十五天(数组)
        • 第四十六天(数组)
      • Sort
        • 最小堆
        • 归并排序(merge_sort)
    • 📓Knowledge
      • python补码
    • 🔧Other
      • pythonic语法
      • Ubuntu备忘
由 GitBook 提供支持
在本页
  • 2.2数据操作
  • 2.2.1创建tensor的函数
  • 2.2.2操作
  • 2.2.3 广播机制
  • 2.2.4 内存开销
  • 2.2.5 Tensor和NumPy相互转换
  • 2.3自动求梯度

这有帮助吗?

导出为 PDF
  1. AI
  2. Pytorch

2数据操作

2.2数据操作

2.2.1创建tensor的函数

torch.empty(5, 3)

torch.rand(5, 3)

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

torch.tensor([5.5, 3]) # 根据数组创建

# 获取形状

print(x.size())

print(x.shape)

还有很多函数可以创建Tensor,去翻翻官方API就知道了,下表给了一些常用的作参考。

函数
功能

Tensor(*sizes)

基础构造函数

tensor(data,)

类似np.array的构造函数

ones(*sizes)

全1Tensor

zeros(*sizes)

全0Tensor

eye(*sizes)

对角线为1,其他为0

arange(s,e,step)

从s到e,步长为step

linspace(s,e,steps)

从s到e,均匀切分成steps份

rand/randn(*sizes)

均匀/标准分布

normal(mean,std)/uniform(from,to)

正态分布/均匀分布

randperm(m)

随机排列

这些创建方法都可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)。

2.2.2操作

三种加法:

x + y

torch.add(x, y)

y.add_(x)  # 就地加法,类似x.copy_(y), x.t_()

改变形状:

# 不同的size,但是是共享data
y = x.view(15)
z = x.view(-1, 5)  # -1所指的维度可以根据其他维度的值推出来
print(x.size(), y.size(), z.size())
# torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])

# 不同size,不同data的新副本
x_cp = x.clone().view(15) # clone会被记录在计算图中,即梯度传播影响源数据

# reshape() 不保证返回的一定是拷贝后的数据

转换python数据

x = torch.randn(1)
print(x)
print(x.item())
# tensor([2.3466])
# 2.3466382026672363

线性代数

另外,PyTorch还支持一些线性函数,这里提一下,免得用起来的时候自己造轮子,具体用法参考官方文档。如下表所示:

函数
功能

trace

对角线元素之和(矩阵的迹)

diag

对角线元素

triu/tril

矩阵的上三角/下三角,可指定偏移量

mm/bmm

矩阵乘法,batch的矩阵乘法

addmm/addbmm/addmv/addr/baddbmm..

矩阵运算

t

转置

dot/cross

内积/外积

inverse

求逆矩阵

svd

奇异值分解

2.2.3 广播机制

当对两个形状不同的Tensor按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。

2.2.4 内存开销

y[:] = y + x # 就地
y = y + x # 非就地
# view只是共享了tensor的数据,二者id(内存地址)并不一致。
# 因为tensor里面还有除了data的数据

2.2.5 Tensor和NumPy相互转换

# tensor to numpy
a = torch.ones(5)
b = a.numpy()
# numpy to tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)

# torch.tensor()将NumPy数组转换成Tensor
# 该方法总是会进行数据拷贝
c = torch.tensor(a)

所有在CPU上的Tensor(除了CharTensor)都支持与NumPy数组相互转换。

2.3自动求梯度

2.3 自动求梯度

Tensor是这个包的核心类,如果将其属性.requires_grad设置为True,它将开始追踪(track)在其上的所有操作(这样就可以利用链式法则进行梯度传播了)。完成计算后,可以调用.backward()来完成所有梯度计算。此Tensor的梯度将累积到.grad属性中。

注意在y.backward()时,如果y是标量,则不需要为backward()传入任何参数;否则,需要传入一个与y同形的Tensor。解释见 2.3.2 节。

如果不想要被继续追踪,可以调用.detach()将其从追踪记录中分离出来,这样就可以防止将来的计算被追踪,这样梯度就传不过去了。

可以用with torch.no_grad()将不想被追踪的操作代码块包裹起来,这种方法在评估模型的时候很常用,因为在评估模型时,我们并不需要计算可训练参数(requires_grad=True)的梯度。

Function是另外一个很重要的类。Tensor和Function互相结合就可以构建一个记录有整个计算过程的有向无环图(DAG)。

每个Tensor都有一个.grad_fn属性,该属性即创建该Tensor的Function, 就是说该Tensor是不是通过某些运算得到的,若是,则grad_fn返回一个与这些运算相关的对象,否则是None。

tensor.requires_grad 用于说明当前量是否需要在计算中保留对应的梯度信息

标量out,直接调用out.backward();不允许使用张量对张量求导,需要加权平均,例如out.backward(w);

如果我们想要修改tensor的数值,但是又不希望被autograd记录(即不会影响反向传播),那么我么可以对tensor.data进行操作。

上一页1.4模型实现下一页Ray+Gym

最后更新于3年前

这有帮助吗?

PyTorch中的Tensor支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,可参考。

在深度学习中,我们经常需要对函数求梯度(gradient)。PyTorch提供的包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。

🤖
⚒️
官方文档
autograd