tensor和numpy中的ndarray很相似,唯一的不同是tensor可以应用在GPU上,来加速计算。
1 创建tensor
|
randn(size) |
创建一个标准正态分布内随机的矩阵 |
|
|
zeros(size) |
全零矩阵 |
|
|
tensor(list) |
创建一个内容为参数的tensor |
|
|
linspace |
同numpy |
|
|
randperm | 返回一个0到n-1的数组 | ![]() |
基本上创建的这些函数都有一个对应的like函数(randn_like,zeros_like…)来创建一个size和形参一样的tensor

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

2.2 ndarray->tensor

3 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的一部分 |
返回的部分和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的略有不同
有开展的首末位置
|
topk | input前k大的元素 |
举例
|
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,如果我们不原地更新,其他引⽤仍然会指向旧的内存位置,这样我们的某些代码可能会⽆意中引⽤旧的参数。导致隐患
- 这是不推荐的,原因有二
- 而后两种写法则不会
本文详细介绍了PyTorch中的tensor操作,包括创建tensor的不同方法,如randn、zeros和list,以及它们的like函数。讨论了tensor与numpy数组之间的转换,强调了转换后它们之间的关联性。此外,讲解了tensor在GPU和CPU间的切换,以及如何查看GPU数量。内容还涵盖了tensor的基本运算,如加法、广播机制、inplace操作,并举例说明。同时,提到了一些常用的torch函数,如size、view、abs、sin等。最后,文章探讨了tensor内存占用的问题,展示了不同操作对内存分配的影响。

































3498

被折叠的 条评论
为什么被折叠?



