pytorch
1.pytorch中标量1.3的维度是0,常用的是loss。 而[1.3]的维度是1
tensor数据的维度dimension表示的就是有几行数据,而size(shape)表示的是这一行有几个数据。
-
pytorch中4维tensor经常用于cnn中,四个维度[b,c,h,w]分别对应一次传入的图片数量,图片的色彩通道(rgb),图片的高和宽。
-
小的torch.tensor([2.,3.2])接受的是数据,大写的torch.Tensor(2,3),或者torch.Floattensor(2,3)接受的是数据的维度。
-
rand会产生[0,1]的初始化数值,不包括1
-
索引中的冒号可以理解为箭头
-
四种切片方式,如左边红框所示
两个冒号就是间隔采样
start:end:step
- 给具体的索引的采样方式
a.index_select(0,torch.tensor([0,2])).shape
# 第一个参数0表示选择抽取的维度是0,第二个参数表示选取的是该维度中的哪几个,这里表示的是选取的是第0,2张图片
- 三个点号任意长度的冒号(维度)
- 使用mask索引后 维度会变化
- take方法 就是把tensor给flatten之后,变成1维nshape,再进行索引
tensor的维度变换
-
view操作
会丢失维度信息 必须保持numel相同 也就是元素个数 -
unsqueeze squeeze
必须要注意序列号。负号容易混淆,注意正号是在之前插入,负号是在之后插入,对应关系如下图 尽量不要用负号
-
tensor的shape属性
shape方法输出的size包含了两个信息,一个是tensor的维度,一个是维度的大小。
比如(2,3)括号里有两个位置(数字)就表示这个tensor有两个维度,而这两个的位置的数字表示了在这个维度下有几个数字,或者说这个维度的大小。
比如说
torch.Size([2])
size里面有一个数字,表示这个tensor的维度是1,数字的大小是2,表明在这个维度里有两个数字。
当在2这个位置前添加一个维度,变成了Size([1,2]),那么这个2的意思也变了,这个tensor就变成了两个维度,第一个维度的大小是1,第二个维度的大小是2,从直观角度来说,变成了一行两列的tensor,原来tensor中的两个元素变成了一行中的两个元素。而在2这个位置后添加一个维度,变成了Size([2,1]),那么2就表示第一个维度中元素的个数,也就是行的个数,1就表示第二个维度中元素的个数,也就是列的个数,而原本tensor中的元素也会按照新的规则排列。如下面代码
a = torch.tensor([1.2,2.3])
print(a.shape)
print(a)
b = a.unsqueeze(-1)
print(b.shape)
print(b)
c = a.unsqueeze(0)
print(c.shape)
print(c)
#输出
torch.Size([2])
tensor([1.2000, 2.3000])
torch.Size([2, 1])
tensor([[1.2000],
[2.3000]])
torch.Size([1, 2])
tensor([[1.2000, 2.3000]])
进程已结束,退出代码0
-
Expand 对维度上的大小进行扩张
1可以扩张成n,但是2,3不能扩张成n,因为没有指定扩张的规则
-1表示不扩张 -
Transpose在进行维度变化的时候 一定要跟踪住维度
-
permute会自动调用transpose
相当于直接指定顺序
broadcasting
是需要符合实际规则的
拼接
stack相当于在把两个tensor通过增加一个维度进行拼接
比如最后一个,把两个班级的成绩合并,用stack在最前面增加一个班级维度,而不是在学生的维度上叠加(把两个班32个学生叠加成64个)
concat叠加的维度可以不一致 但是stack不行
拆分
拆分操作分为两种 :一是按照指定的数量对指定的维度拆分,二是按照指定的长度对指定的维度拆分。 具体演示代码和结果如下:
c1 = torch.rand(32,8)
c2 = torch.rand(32,8)
c3 = torch.rand(32,8)
c = torch.stack([c1,c2,c3],dim=0)
print(c.shape)
c4, c5 = c.split([2,1],dim=0)
c6, c7, c8 = c.split([10,10,12],dim=1) #按照指定的数量分割
c9, c10 = c.split(4,dim=2) #按照长度分割
print(c4.shape)
print(c5.shape)
print(c6.shape)
print(c7.shape)
print(c8.shape)
print(c9.shape)
print(c10.shape)
#输出
torch.Size([3, 32, 8])
torch.Size([2, 32, 8])
torch.Size([1, 32, 8])
torch.Size([3, 10, 8])
torch.Size([3, 10, 8])
torch.Size([3, 12, 8])
torch.Size([3, 32, 4])
torch.Size([3, 32, 4])
进程已结束,退出代码0
tensor运算
clamp
限制上下的赋值在0~10
范数
取哪个维度上的范数 哪个维度就会消掉
argmax argmin
求出来的不是具体的数值,而是最大最小值的索引
这里argmax加了dim信息,就可以指定在哪个维度上进行求最大值的索引