[pytorch]常用函数(自用)

一、公共部分

1、torch.linespace

返回一维张量,在start和end之间(包括start也包括end)的均匀间隔的steps个点,长度为steps。

python 复制代码
print(torch.linspace(1,10,3))  #输出tensor([ 1.0000,  5.5000, 10.0000])
print(torch.linspace(-10,10,10))  #tensor([-10.0000,  -7.7778,  -5.5556,  -3.3333,  -1.1111,   1.1111,   3.3333, 5.5556,   7.7778,  10.0000])

2、torch.from_array(ndarray)->Tensor

返回的张量和ndarray共享一片存储区域,修改一个会导致另一个的修改。返回的张量不能改变大小

python 复制代码
a=np.array([[1,2,3],[4,5,6]])
b=torch.from_numpy(a)
print(b)#输出tensor([[1, 2, 3],
        #[4, 5, 6]], dtype=torch.int32)
b[0][0]=11
print(a)#输出[[11  2  3] #[ 4  5  6]]

3、torch.numel(input)->int

返回tensor中元素的总个数

python 复制代码
a=torch.rand(1,2,3,4)
print(torch.numel(a))#输出24

4、torch.logspace(start,end,steps,out=None)

生成10的start次方和10的end次方的steps个数据点

python 复制代码
print(torch.logspace(-10,10,10))#输出tensor([1.0000e-10, 1.6681e-08, 2.7826e-06, 4.6416e-04, 7.7426e-02, 1.2915e+01,
        #2.1544e+03, 3.5938e+05, 5.9948e+07, 1.0000e+10])

5、torch.rand(*size)

生成均值为0,方差为1的高斯分布数据

python 复制代码
print(torch.randn((2,3)))

6、torch.randn(*size)

生成均值为0,方差为1的高斯分布数据

python 复制代码
print(torch.randn((2,3)))

7、torch.arange(start,end,step=1,out=None)

返回一维张量,在[start,end)之间

torch.range(start,end,step=1,out=None)没什么区别,只不过数据包含end

python 复制代码
print(torch.arange(1,89,9))#输出tensor([ 1, 10, 19, 28, 37, 46, 55, 64, 73, 82])

二、索引 切片 连接 换位

2.1 torch.cat(tensors,dim=0,out=None)

第⼀个参数tensors是你想要连接的若⼲个张量,按你所传⼊的顺序进⾏连接,注意每⼀个张量需要形状相同,或者更准确的说,进⾏⾏连接的张量要求列数相同,进⾏列连接的张量要求⾏数相同

第⼆个参数dim表⽰维度,dim=0则表⽰按⾏连接,dim=1表⽰按列连接

python 复制代码
a=torch.tensor([[1,2,3,4],[1,2,3,4]])
b=torch.tensor([[1,2,3,4,5],[1,2,3,4,5]])
print(torch.cat((a,b),1))

#输出结果为:

tensor(\[1, 2, 3, 4, 1, 2, 3, 4, 5,

1, 2, 3, 4, 1, 2, 3, 4, 5])

2.2 torch.chunk(tensor,chunks,dim=0)

torch.cat()函数是把各个tensor连接起来,这⾥的torch.chunk()的作⽤是把⼀个tensor均匀分割成若⼲个⼩tensor

源码定义:torch.chunk(intput,chunks,dim=0)

第⼀个参数input是你想要分割的tensor

第⼆个参数chunks是你想均匀分割的份数,如果该tensor在你要进⾏分割的维度上的size不能被chunks整除,则最后⼀份会略⼩(也可能为空)

第三个参数表⽰分割维度,dim=0按⾏分割,dim=1表⽰按列分割

该函数返回由⼩tensor组成的list

python 复制代码
c=torch.tensor([[1,4,7,9,11],[2,5,8,9,13]])
print(torch.chunk(c,3,1))

#输出结果为:

(tensor(\[1, 4,

2, 5]), tensor(\[7, 9,

8, 9]), tensor(\[11,

13]))

2.3 torch.gather(input,dim,index,out=None)

灵活的选取index指定的位置的值进行聚合

注意:

1.index必须是一个张量,不能是普通数组

2.index的形状和input的形状可以不相同

3.index的值作为位置的索引

4.选取值的规则如下:

outijk = tensorindex\[ijk]jk # dim=0

outijk = tensoriindex\[ijk]k # dim=1

outijk = tensorijindex\[ijk] # dim=3

python 复制代码
torch.set_printoptions(precision=2)
a=torch.rand(2,3)
aa=torch.gather(a,1,index=torch.LongTensor([[0,1,2],[2,1,1]]))
print("a=",a)
print("aa=",aa)

每个位置的输出结果是:

0,0\] \[0,1\] \[0,2

1,2\] \[1,1\] \[1,1

注:输出的形状和index一致

说明:如果还存在歧义请参考链接:https://www.cnblogs.com/yanghailin/p/18007025

2.4 torch.index_select(input, dim, index)

python 复制代码
torch.set_printoptions(precision=2)
# 选取第0行和第3行
a=torch.rand(4,6)
aa=torch.index_select(a,dim=0,index=torch.LongTensor([0,3]))
print('a=',a)
print('aa=',aa)
# 选取第1列和第5列
aaa=torch.index_select(a,dim=1,index=torch.LongTensor([1,5]))
print('aaa=',aaa)
# 选取a的第0行第3行、第1列和第5列,没有先后顺序
aaaa=torch.index_select(aa,dim=1,index=torch.LongTensor([1,5]))
print('aaaa=',aaaa)

2.5 torch.masked_select(input,mask)

python 复制代码
a=torch.rand(2,3)
mask1=torch.BoolTensor([[1,0,1],[0,1,0]])
mask2=torch.ByteTensor([[True,False,True],[False,True,False]])
mask3=torch.BoolTensor([[True,False,True],[False,True,False]])
#[[True,False,True],[False,True,False]]
aa=torch.masked_select(a,mask3)
print('a=',a)
print('aa=',aa)

2.6 torch.nonzero(input)

返回非0元素的位置索引

如果输入是n维,那么输出的tensor形状是z*n的,z是输入中所有非0元素的总个数

python 复制代码
a=torch.tensor([[[1,0,3],[0,0,9]],[[1,2,0],[0,9,0]]])
aa=torch.nonzero(a)
print('a=',a)
print('aa=',aa)

2.7 torch.split(tensor,split_size,dim)

split_size是切分成的单个块的大小,和chunk不同的是chunk指定的是分块的个数的数量,相同点是它们返回的都是元组,两个效果类似

python 复制代码
a=torch.rand(2,3)
aa=torch.split(a,2,dim=1)
print('a=',a)
print('aa=',aa)

2.8 torch.squeeze(input,dim=None)

将形状中为1的维度去除,比如输入的形状是(A1 BC D1 E)那么输出的形状是(AB CD E)

就指定维度,也只对1的形状有效,如果指定的维度长度不为1,则无效,原样输出

python 复制代码
a=torch.rand(2,3,1)
aa=torch.squeeze(a)
print('a=',a.size())
print('aa=',aa.size())
aaa=torch.squeeze(a,dim=1)
print('aaa=',aaa.size())

注意:

虽然squeeze前后squeeze后的维度不一致,但是数据量(数据元素的个数)是一致的,并且它们共享一片存储区域,当修改其中一个值时,另一个也会跟着修改。

2.9 torch.stack(sequence,dim=0)-堆叠函数

将序列中包含的张量按照指定维度连接,所有张量的形状应该相同,否则会报错。增加新维度,不是在原有基础上叠加

如两个(2,3)进行stack得到的不会是(4,3),而是(2,2,3)

python 复制代码
a=torch.rand(2,3)
b=torch.rand(2,3)
ab=torch.stack((a,b),dim=0)
print('a=',a)
print('b=',b)
print('ab_size=',ab.size())
print('ab=',ab)

2.10 torch.transpose(input,dim0,dim1)-转置函数

1)交换维度

python 复制代码
a=torch.rand(2,3,4)
print('a_size:',a.size())
aa=torch.transpose(a,2,1)
print('aa_size:',aa.size())

  1. 共享内存

2.11 torch.unbind(tensor,dim)-解除维度

(2,3,4)->(1,3,4)+(1,3,4)的元组dim=0时

(2,3,4)->(2,1,4)+(2,14)+(2,1,4)的元组dim=1时

python 复制代码
a=torch.rand(2,3,4)
aa=torch.unbind(a,1)
print(aa)
print(aa[1].size())

返回的是元组

2.12 torch.unsqueeze(tensor,dim)

1)squeeze的反操作,在dim指定的位置增加一个长度为1的维度(ab cd)->(a 1b c*d)若dim=1

2)共享内存

python 复制代码
a=torch.rand(2,3,4)
aa=torch.unsqueeze(a,2)
print(aa.size())
相关推荐
AIOps打工人5 分钟前
女朋友想要专属桌宠?我用 AI 提示词,1 小时把照片变成 57 帧动画精灵
人工智能
大囚长16 分钟前
自由能原理视域下的游戏成瘾机制——以“羊了个羊”为例
人工智能·游戏
水如烟36 分钟前
孤能子视角:三十六计之远交近攻——拓扑重构
人工智能
YOLO数据集集合40 分钟前
番茄病害智能诊断系统:YOLO+DeepSeek农业AI落地实践
人工智能·yolo·目标检测·计算机视觉
花花无缺42 分钟前
Windows 定时执行 Python 脚本方案
python·操作系统·命令行
QN1幻化引擎42 分钟前
我写了一个「有八层意识结构」的 Python 认知引擎,它没有用任何 LLM
人工智能·算法·架构
我命由我123451 小时前
72 法则极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
anyup1 小时前
这一套绝了!AI 大模型写故事,星云 SDK 驱动 3D 数字人实时演绎
前端·人工智能·aigc
张彦峰ZYF1 小时前
大模型LLM ACA - ACP认证考试真题冲刺演练二答案参考
人工智能·lora·llm·embedding·rag·few-shot