网站建设意见,做ppt的图片素材网站,校园网上零售网站建设方案,惠州百度搜索排名优化课程地址 最近做实验发现自己还是基础框架上掌握得不好#xff0c;于是开始重学一遍PyTorch框架#xff0c;这个是课程笔记#xff0c;这个课还是讲的简略#xff0c;我半小时的课听了一个半小时。
1. 张量
1.1 张量操作
#xff08;1#xff09;chunk#xff1a;将一…课程地址 最近做实验发现自己还是基础框架上掌握得不好于是开始重学一遍PyTorch框架这个是课程笔记这个课还是讲的简略我半小时的课听了一个半小时。
1. 张量
1.1 张量操作
1chunk将一个张量分割为特定数目的张量每个块都是输入张量的视图。
按维度0分割
import torchb torch.rand([3, 2]) # 随机生成3x2维度的张量
print(b, b)
c, d torch.chunk(b, chunks2) # 将b分割为c和d两个张量默认沿着维度0去分割按行分割
print(c, c)
print(d, d) # 最后一个张量维度会稍微小一点因为3不能被2整除运行结果 b tensor([[0.7704, 0.8685], [0.0165, 0.5076], [0.2730, 0.2270]]) c tensor([[0.7704, 0.8685], [0.0165, 0.5076]]) d tensor([[0.2730, 0.2270]])
按维度1分割
import torchb torch.rand([3, 2]) # 随机生成3x2维度的张量
print(b, b)
c, d torch.chunk(b, chunks2, dim1) # 将b分割为c和d两个张量默认沿着维度1去分割按列分割
print(c, c)
print(d, d) # 最后一个张量维度会稍微小一点因为3不能被2整除运行结果 b tensor([[0.1275, 0.9670], [0.5189, 0.0748], [0.6840, 0.7675]]) c tensor([[0.1275], [0.5189], [0.6840]]) d tensor([[0.9670], [0.0748], [0.7675]]) 2dsplit将具有三个或更多维度的张量按深度拆分为多个张量。
import torch# 按深度划分按最后一个维度划分看打印结果
a torch.arange(16.0).reshape(2, 2, 4)
print(a)
b torch.dsplit(a, 2) # 均分两份
print(b)
c torch.dsplit(a, [3, 6]) # 第一份是按最后一个维度取前三个值第二份是6个
print(c)
d torch.dsplit(a, [2, 4]) # 第一份是1个第二份是4个
print(d)
e torch.dsplit(a, [1, 1, 2]) # 第一份是1个第二份是1个第三分是2个
print(e)运行结果 tensor([[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.]], [[ 8., 9., 10., 11.], [12., 13., 14., 15.]]]) (tensor([[[ 0., 1.], [ 4., 5.]], [[ 8., 9.], [12., 13.]]]), tensor([[[ 2., 3.], [ 6., 7.]], [[10., 11.], [14., 15.]]])) (tensor([[[ 0., 1., 2.], [ 4., 5., 6.]], [[ 8., 9., 10.], [12., 13., 14.]]]), tensor([[[ 3.], [ 7.]], [[11.], [15.]]]), tensor([], size(2, 2, 0))) (tensor([[[ 0., 1.], [ 4., 5.]], [[ 8., 9.], [12., 13.]]]), tensor([[[ 2., 3.], [ 6., 7.]], [[10., 11.], [14., 15.]]]), tensor([], size(2, 2, 0))) (tensor([[[ 0.], [ 4.]], [[ 8.], [12.]]]), tensor([], size(2, 2, 0)), tensor([[[ 1.], [ 5.]], [[ 9.], [13.]]]), tensor([[[ 2., 3.], [ 6., 7.]], [[10., 11.], [14., 15.]]]))
3dstack按深度顺序沿第三轴堆叠张量。
import torcha torch.tensor([1, 2, 3]) # 行向量
b torch.tensor([4, 5, 6])
print(torch.dstack((a,b)))
a torch.tensor([[1],[2],[3]]) # 列向量
b torch.tensor([[4],[5],[6]])
print(torch.dstack((a,b)))运行结果 tensor([[[1, 4], [2, 5], [3, 6]]]) tensor([[[1, 4]], [[2, 5]], [[3, 6]]])
4hstack按水平顺序堆叠张量按列
import torcha torch.tensor([1, 2, 3]) # 行向量
b torch.tensor([4, 5, 6])
print(torch.hstack((a,b)))
a torch.tensor([[1],[2],[3]]) # 列向量
b torch.tensor([[4],[5],[6]])
print(torch.hstack((a,b)))运行结果 tensor([1, 2, 3, 4, 5, 6]) tensor([[1, 4], [2, 5], [3, 6]])
5gather沿着某一个维度取变量根据索引取变量这个一看就晕但是我找到了一篇比较好的文章讲解这个 torch.gather() 和torch.sactter_()的用法简析这个讲的最好我就是按照这个学的
import torcht torch.tensor([[1, 2], [3, 4]])
a torch.gather(t, 1, torch.tensor([[0, 0], [1, 0]])) # 按维度1和[[0, 0], [1, 0]]的下标取张量t的元素
# out[i,j] t[i][a[i, j]]
# out[0,0] t[0][a[0, 0]]t[0][0]1
# out[0,1] t[0][a[0, 1]]t[0][0]1
# 所以out[0][1, 1]
# out[1,0] t[1][a[1, 0]]t[1][1]4
# out[1,1] t[1][a[1, 1]]t[1][0]3
# 所以out[1][4, 5]
# 所以out[[1, 1], [4, 3]]
print(a)
a torch.gather(t, 0, torch.tensor([[0, 0], [1, 0]])) # 按维度0和[[0, 0], [1, 0]]的下标取张量t的元素
# out[i,j] t[a[i, j]][j]
# out[0,0] t[a[0, 0]][0]t[0][0]1
# out[0,1] t[a[0, 1]][1]t[0][1]2
# 所以out[0][1, 2]
# out[1,0] t[a[1, 0]][0]t[1][0]3
# out[1,1] t[a[1, 1]][1]t[0][1]2
# 所以out[1][3, 2]
# 所以out[[1, 2], [3, 2]]
print(a)运行结果 tensor([[1, 1], [4, 3]]) tensor([[1, 2], [3, 2]])
6reshape返回一个张量其数据和元素数量与输入相同但具有指定的形状改变形状不改变顺序比如原来是从左到右然后改成多行后是按从左到右从上到下顺序重新改变形状。
import torcha torch.arange(4.) # 生成从0到3的一维张量
print(torch.reshape(a, (2, 2))) # 改成2X2张量
b torch.tensor([[0, 1], [2, 3]])
print(torch.reshape(b, (-1,))) # -1自动推断变成一维运行结果 tensor([[0., 1.], [2., 3.]]) tensor([0, 1, 2, 3]) 【注】一般在方法名后面加下划线的都是原地操作内存位置不会发生改变 7scatter_ torch.gather() 和torch.sactter_()的用法简析按索引张量更新元素。
import torchsrc torch.arange(1, 11).reshape((2, 5))
print(src)
index torch.tensor([[0, 1, 2, 0]])
a torch.zeros(3, 5, dtypesrc.dtype) # 初始化一个和src张量数据类型一样的3X5的0张量
# 这样方便观察非0的部分就是修改过的
z a.scatter_(0, index, src) # 按索引张量将src中的元素写入到z中按维度0写入
# z[index[i][j],j]src[i][j]index中i只有0j从0到3
# z[index[0][0],0]z[0,0]src[0][0]1
# z[index[0][1],1]z[1,1]src[1][1]6
# z[index[0][2],2]z[2,2]src[2][2]i越界1个相当于又变回0索引只有(0,1),则2对应的应该是0,1,0的0以此类推循环src[0][2]3
# z[index[0][3],3]z[0,3]src[0][3]4
print(z)
a torch.zeros(3, 5, dtypesrc.dtype)
z a.scatter_(1, index, src) # 按索引张量将src中的元素写入到z中按维度1写入
# z[i,index[i][j]]src[i][j]index中只有0j从0到3
# z[0,index[0][0]]z[0,0]src[0][0]1
# z[0,index[0][1]]z[0,1]src[0][1]2
# z[0,index[0][2]]z[0,2]src[0][2]3
# z[0,index[0][3]]z[0,0]src[0][3]4被覆盖最终z[0,0]4
print(z)运行结果 tensor([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]]) tensor([[1, 0, 0, 4, 0], [0, 2, 0, 0, 0], [0, 0, 3, 0, 0]]) tensor([[4, 2, 3, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
8scatter_add_以与 scatter_() 类似的方式将张量 src 中的所有值添加到索引张量中指定的索引处的 self 中。
import torchsrc torch.ones((2, 5))
print(src)
index torch.tensor([[0, 1, 2, 0, 0]])
z torch.zeros(3, 5, dtypesrc.dtype).scatter_add_(0, index, src) # 按维度0进行相加
print(z)
# z[index[i][j], j]src[i][j],i只能为0j从0到4
# z[index[0][0], 0]z[0,0]src[0][0]1
# z[index[0][1], 1]z[1,1]src[0][1]1
# z[index[0][2], 2]z[2,2]src[0][2]1
# z[index[0][3], 3]z[0,3]src[0][3]1
# z[index[0][4], 4]z[0,4]src[0][4]1运行结果 tensor([[1., 1., 1., 1., 1.], [1., 1., 1., 1., 1.]]) tensor([[1., 0., 0., 1., 1.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.]]) 9split将张量划分为多块每块都是原来张量的一部分。
import torcha torch.arange(10).reshape(5, 2)
print(a)
print(torch.split(a, 2)) # 分成两份最后一份可能会少一点要保证前面均分
print(torch.split(a, [1, 4])) # 按1:4比例划分不指定参数默认按0维度行划分运行结果 tensor([[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]) (tensor([[0, 1], [2, 3]]), tensor([[4, 5], [6, 7]]), tensor([[8, 9]])) (tensor([[0, 1]]), tensor([[2, 3], [4, 5], [6, 7], [8, 9]])) chunk和split的区别【GPT回答】chunk 函数将张量均匀分成几块每块大小相等。split 函数可以根据指定的大小或部分来分割张量每个块的大小可以不相等。总的来说如果您需要将张量均匀地分成几块可以使用 chunk 函数。如果您需要更灵活地指定每个块的大小或部分可以使用 split 函数。 10squeeze将张量中所有维度为1的那个维度移除掉
import torcha torch.tensor([[[1, 2, 3], [1, 2, 3]]]) # 2x3x1张量
a torch.squeeze(a) # 压缩维度为1的维度变成2维张量2X3
print(a)a torch.tensor([[[[1, 2, 3], [1, 2, 3]]]]) # 2x3x1x1张量
a torch.squeeze(a) # 压缩维度为1的维度变成2维张量2X3
print(a)# 压缩指定的维度为1的维度PyTorch低于2.0版本指定的维度不能是list就是相当于用list的元素多次指定要压缩的维度为1的维度的索引所以这里写dim 2
a torch.tensor([[[[1, 2, 3], [1, 2, 3]]]]) # 2x3x1x1张量
a torch.squeeze(a, dim2) # 压缩维度为1的维度且索引为2变成3维张量2X3x1
print(a)运行结果 tensor([[1, 2, 3], [1, 2, 3]]) tensor([[1, 2, 3], [1, 2, 3]]) tensor([[[[1, 2, 3], [1, 2, 3]]]]) 11stack沿着某一个新的维度将一系列张量拼接起来。
import torcha torch.ones(3, 2) # 3x2 全是1的张量
b torch.zeros(3, 2) # 3x3 全是0的张量
c torch.stack([a, b]) # dim 默认为0它们合并到新的张量的第0维新的张量的元素分别是a, b相当于最后是一个三维张量
print(c)c torch.stack([a, b], dim1) # 按行拼接
print(c)
运行结果 tensor([[[1., 1.], [1., 1.], [1., 1.]], [[0., 0.], [0., 0.], [0., 0.]]]) tensor([[[1., 1.], [0., 0.]], [[1., 1.], [0., 0.]], [[1., 1.], [0., 0.]]])
进程已结束,退出代码0
它们是这样的张量接下来的看法可能不对 如果按维度0进行拼接 后面全是1按0维度这样看就是 tensor([[[1., 1.], [1., 1.], [1., 1.]], [[0., 0.], [0., 0.], [0., 0.]]]) 如果按维度1拼接 按1维度这样看就是 tensor([[[1., 1.], [0., 0.]], [[1., 1.], [0., 0.]], [[1., 1.], [0., 0.]]])