Pytorch 笔记——tensor

本文详细介绍了PyTorch中的tensor操作,包括创建tensor的不同方法,如randn、zeros和list,以及它们的like函数。讨论了tensor与numpy数组之间的转换,强调了转换后它们之间的关联性。此外,讲解了tensor在GPU和CPU间的切换,以及如何查看GPU数量。内容还涵盖了tensor的基本运算,如加法、广播机制、inplace操作,并举例说明。同时,提到了一些常用的torch函数,如size、view、abs、sin等。最后,文章探讨了tensor内存占用的问题,展示了不同操作对内存分配的影响。

tensor和numpy中的ndarray很相似,唯一的不同是tensor可以应用在GPU上,来加速计算。

创建tensor

randn(size)

创建一个标准正态分布内随机的矩阵

zeros(size)

全零矩阵

tensor(list)

创建一个内容为参数的tensor

linspace

同numpy

randperm

返回一个0到n-1的数组

基本上创建的这些函数都有一个对应的like函数(randn_like,zeros_like…)来创建一个size和形参一样的tensor

tensor和ndarray的转换

无论谁转换成谁,转换的tensor和ndarray都是另一个的引用,要变一起变。

2.1 tensor->ndarray

2.2 ndarray->tensor

cuda和cpu的tensor切换

3.1 查看可用GPU数量

4 一些关于tensor的运算

很多运算符都在末尾有一个_,表示inplace操作

加法

+

tensor.add

torch.add

修改一个的值

(很多运算符都在末尾有一个_,表示inplace操作

4.1 广播

在某些情况下,即使形状不同, 仍然可以通过调⽤⼴播机制来执⾏按元素操作。
这种机制的⼯作⽅式如下:
  • ⾸先,通过适当复制元素来扩展⼀个或两个数组,以便在转换之后,两个张量具有相同的形状。
  • 其次,对⽣成的数组执⾏按元素操作。
import torch
a=torch.arange(3).reshape((3,1))
b=torch.arange(2).reshape((1,2))
a+b
'''
tensor([[0, 1],
        [1, 2],
        [2, 3]])
'''

'''
a 是
[[0],
[1],
[2]]

b是[[0,1]]

直接a+b是不行的,但这里用广播的方式,机理是这样的:
将a,b分别复制成3*2的形式

a':
[[0,0],
[1,1],
[2,2]]

b':
[[0,1],
[0,1],
[0,1]]

然后逐项相加
'''

5. torch的函数

很多函数 torch.func(tensor)和tensor.func()是等价的。

size()

tensor的形状

view

torch里面的“reshape”

item

如果tensor中只有一个元素的时候,使用这个函数获取这个

数值

abs

绝对值

sin

mm

矩阵相乘

norm

向量的L2范数

矩阵的Frobenius范数

(相当于把他拉成一个长向量,然后算L2范数)

pow

cat

合并数组

axis=0 沿着列的方向[1…n][0]

axis=1 沿着行的方向[0][1;;;n]

axis=0 (从左往右数)第0个坐标的元素叠加,其他坐标的元素不变

axis=1 第1个坐标的元素叠加,其他坐标的元素不变

还有一种理解方式是,如果axis=0的话,那么输出结果上,除了第0个维度之外,其他维度上的数字不变,仅第0个维度的数字会做相应的改变

max

如果又axis参数的话,返回的第一个下标是所有的最大值,第二个下标是最大值对应的index。

axis=0 [1~n][0]里面找到最大的一个,

也就是第零个坐标的参数变化(去比较),其他坐标的参数不变

axis=1 [0][1~n]里面找到最大的一个,

也就是第一个坐标的参数变化(去比较),其他坐标的参数不变

一般带axis的操作,操作完之后axis对应的维度就没有了。如果想要保留axis的那一个维度,需要在操作里面设置keepdim=True

narrow()

截取tensor的一部分
torch.narrow(input, dim, start, length) 

 返回的部分和input 共享内存

input 需要被截取的tensor

dim 沿着那个维度截取

start 起始截取下标

length  截取多长的

 

(沿着第0个下标截取) 

(沿着第1个下标截取)

squeeze()

我们首先创建一个维度为(1,2,3)的tensor

然后对他squeeze

只有squeeze对应的维度为1的时候,我们才会把这个维度去掉,不然的话维度保持不变

unsqueeze

masked_fill(data,x)

将data为True的相应位置的值替换为x

 numel

tensor中元素的个数

permute 

tensor维度换位

(2,0,1)的意思是,维度变换成:(原来的第二个,原来的第0个,原来的第1个) 

t

转置

logical_not

逻辑取反

flatten

展平

这里和numpy的略有不同

torch.flatten(inputstart_dim=0end_dim=- 1)

有开展的首末位置

topk

input前k大的元素
torch.topk(input, k, dim=None, largest=True, sorted=True, *, out=None)
  • largest:如果是False,那么就选择前k小的输
  • 返回(values,indices)的namedtuple,indices是给定维度上的indices

举例

 

6 Tensor内存占用

运⾏⼀些操作可能会导致为新结果分配内存,看下面例子中三种写法:
a=torch.arange(3).reshape((3,1))
b=torch.arange(3).reshape((3,1))
A0=id(a)
B0=id(b)
a=a+b
A1=id(a)
B1=id(b)
A0==A1,B0==B1
#(False, True)
A0=id(a)
B0=id(b)
a[:]=a+b
A1=id(a)
B1=id(b)
A0==A1,B0==B1
#(True, True)
A0=id(a)
B0=id(b)
a+=b
A1=id(a)
B1=id(b)
A0==A1,B0==B1
#(True, True)
  • 如果我们⽤Y = X + Y,将会取消引⽤Y指向的张量, ⽽是指向新分配的内存处的张量。
    • 这是不推荐的,原因有二
      • ·1,这样会不必要地分配很多内存
      •   2,如果我们不原地更新,其他引⽤仍然会指向旧的内存位置,这样我们的某些代码可能会⽆意中引⽤旧的参数。导致隐患
  • 而后两种写法则不会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值