一、张量数据类型
1.1 pytorch与python数据类型对比
python
pytorch
Int
IntTensor of size()
float
FloatTensor of size()
Int array
IntTensor of size [d1,d2,…]
Float array
FloatTensor of size [d1,d2,…]
string
ont-hot or Embedding(Word2Vec,glove)
由于PyTorch不是一个完备的语言库,它是面向数据计算的GPU加速库,因此没有内建对string的支持,在PyTorch中可用以下两种方式来表示string:
1.2 pytorch内建的数据类型
Data tyoe
dtype
CPU tensor
GPU tensor
32-bit floating point
torch.float32 or torch.float
torch.FloatTensor
torch.cuda.FloatTensor
64-bit floating point
torch.float64 or torch.double
torch.DoubleTensor
torch.cuda.DoubleTensor
16-bit floating point
torch.float16 or torch.half
N/A
torch.cuda.HalfTensor
8-bit integer (unsigned)
torch.uint8
torch.ByteTensor
torch.cuda.ByteTensor
8-bit integer (signed)
torch.int8
torch.CharTensor
torch.cuda.CharTensor
16-bit integer (signed)
torch.int16 or torch.short
torch.ShortTensor
torch.cuda.ShortTensor
32-bit integer (signed)
torch.int32 or torch.int
torch.IntTensor
torch.cuda.IntTensor
64-bit integer (signed)
torch.int64 or torch.long
torch.LongTensor
torch.cuda.LongTensor
Tpye check
Tensor.type()
type(Tensor)
isinstance(Tensor,torch.FloatTensor)
view code >>> a = torch.randn(2 ,3 )
>>> a.type ()
'torch.FloatTensor'
>>> type (a)
<class 'torch.Tensor' >
>>> isinstance (a,torch.FloatTensor)
True
>>> isinstance (a,torch.cuda.DoubleTensor)
False
>>> data = a.cuda()
>>> isinstance (data,torch.cuda.DoubleTensor)
>>> True
标量:Dimension 0/rank 0 ,Deep Learning中常用于loss表示
view code >>> torch.tensor(2.2 )
tensor(2.2000 )
>>> a = torch.tensor(2.2 )
>>> a.shape
torch.Size([])
>>> len (a.shape)
0
>>> a.dim()
0
>>> a.size()
torch.Size([])
Dimension 1/rank 1,Deep Learning中常用于Bias表示
view code >>> torch.tensor([1.1 ])
tensor([1.1000 ])
>>> torch.tensor([1.1 ,2.2 ])
tensor([1.1000 , 2.2000 ])
>>> torch.FloatTensor(2 )
tensor([2.2758e-07 , 4.5682e-41 ])
>>> data = np.ones(2 )
>>> data
array([1. , 1. ])
>>> torch.from_numpy(data)
tensor([1. , 1. ], dtype=torch.float64)
Dimension 2
view code >>> a = torch.randn(2 ,3 )
>>> a
tensor([[-0.1680 , 0.4534 , -0.4045 ],
[-1.0437 , -0.4634 , 0.7432 ]])
>>> a.shape
torch.Size([2 , 3 ])
>>> a.size(0 )
2
>>> a.size(1 )
3
>>> a.shape[0 ]
2
>>> a.shape[1 ]
3
Dim 3:RNN Input with Batch
view code >>> a=torch.rand(1 ,2 ,3 )
>>> a
tensor([[[0.2226 , 0.0342 , 0.1301 ],
[0.6371 , 0.6930 , 0.9356 ]]])
>>> a.shape
torch.Size([1 , 2 , 3 ])
>>> a[0 ]
tensor([[0.2226 , 0.0342 , 0.1301 ],
[0.6371 , 0.6930 , 0.9356 ]])
>>> list (a.shape)
[1 , 2 , 3 ]
Dim4:CNN[b,c,h,w]
numbel是指tensor占用内存的数量
view code >>> a = torch.rand(2 ,3 ,28 ,28 )
>>> a
tensor([[[[0.7190 , 0.8762 , 0.3667 , ..., 0.8682 , 0.5834 , 0.7012 ],
[0.4110 , 0.5633 , 0.1516 , ..., 0.6877 , 0.1930 , 0.9480 ],
[0.0063 , 0.8593 , 0.4722 , ..., 0.4012 , 0.8891 , 0.0254 ],
...,
...,
[0.3267 , 0.8081 , 0.5329 , ..., 0.3658 , 0.9325 , 0.6759 ],
[0.4113 , 0.8107 , 0.9934 , ..., 0.2609 , 0.1763 , 0.5233 ],
[0.7673 , 0.3748 , 0.0287 , ..., 0.0348 , 0.0529 , 0.8054 ]]]])
>>> >>> a.shape
torch.Size([2 , 3 , 28 , 28 ])
>>> a.numel()
4704
>>> a.dim()
4
>>> a=torch.tensor(1 )
>>> a.dim()
0
创建Tensor
Import form array
view code >>> a=np.array([2 ,3 ,3 ])
>>> torch.from_numpy(a)
tensor([2 , 3 , 3 ])
>>> a=np.ones([2 ,3 ,3 ])
>>> torch.from_numpy(a)
tensor([[[1. , 1. , 1. ],
[1. , 1. , 1. ],
[1. , 1. , 1. ]],
[[1. , 1. , 1. ],
[1. , 1. , 1. ],
[1. , 1. , 1. ]]], dtype=torch.float64)
view code torch.tensor([2. ,3.2 ])
tensor([2.0000 , 3.2000 ])
torch.FloatTensor([2. ,3.2 ])
tensor([2.0000 , 3.2000 ])
torch.Tensor([2. ,3.2 ])
tensor([2.0000 , 3.2000 ])
torch.tensor([[2. ,3.2 ],[1. ,22.3 ]])
tensor([[ 2.0000 , 3.2000 ],
[ 1.0000 , 22.3000 ]])
view code **torch.FloatTensor和torch.Tensor基本是一样的,都是接受书的维度shape创建Tensor,而小写的torch.tensor是接受具体的数据**
uninitialized
Torch.empty(2,3)
Torch.FloatTensor(d1,d2,d3)
Torch.IntTensor(d1,d2,d3)
注意未初始化的api在使用的时候,若后续没有赋值操作覆盖,将会使得随机初始化的值变的非常大或者非常小(troch.nan/inf)
随机初始化
torch.rand
torch.rand_like
torch.randint
torch.randn:正态分布
torch.normal:自定义分布
view code >>> torch.rand(3 ,3 )
tensor([[0.3628 , 0.4771 , 0.5067 ],
[0.6593 , 0.6323 , 0.9157 ],
[0.5882 , 0.6289 , 0.4311 ]])
>>> a=torch.rand(3 ,3 )
>>> torch.rand_like(a)
tensor([[0.5168 , 0.9998 , 0.1509 ],
[0.6104 , 0.5265 , 0.7917 ],
[0.3084 , 0.9142 , 0.0541 ]])
>>> torch.randint(1 ,10 ,[3 ,3 ])
tensor([[2 , 2 , 6 ],
[3 , 9 , 1 ],
[4 , 5 , 4 ]])
>>> torch.normal(mean=torch.full([10 ],0 ),std=torch.arange(1 ,0 ,-0.1 ))
tensor([-2.1002 , -0.2133 , 0.9746 , 0.6781 , 0.3725 , 0.6669 , 0.4720 , 0.7872 ,
0.0643 , 0.0143 ])
set default type
view code >>> torch.tensor([1.2 ,3 ]).type ()
'torch.FloatTensor'
>>> torch.set_default_tensor_type(torch.DoubleTensor)
>>> torch.tensor([1.2 ,3 ]).type ()
'torch.DoubleTensor'
二、torch常用函数
在使用Tensor时,我们首先要掌握如何使用Tensor来定义不同数据类型的变量。和Numpy差不多,PyTorch中的Tensor也有自己的数据类型定义方式,常用的如下:
1.张量Tensors
torch.is_tensor(obj) #判断是否为张量,如果是pytorch张量,则返回True
torch.is_storage(obj) #判断是否为pytorch Storage,如何是,则返回True
torch.set_default_tensor_type(t)
torch.numel(input)->int
torch.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, profile=None) #设置打印选项。 完全参考自 Numpy 。
2.创建操作 Creation Ops
torch.eye
torch.eye(n, m=None, out=None)->Tensor
返回一个2维张量(单位矩阵),对角线数字为1,其它位置为0
参数说明:
n
(int) – 行数
m
(int, 可选) – 列数.如果为None,则默认为n
out
(Tensor,可选) - 输出张量
view code >>> torch.eye(4 )
tensor([[1. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. ],
[0. , 0. , 1. , 0. ],
[0. , 0. , 0. , 1. ]])
torch.zero
torch.zeros(*sizes, out=None) → Tensor
返回一个全0的张量,形状由可变参数sizes
定义。
view code >>> torch.zeros(2 ,3 )
tensor([[0. , 0. , 0. ],
[0. , 0. , 0. ]])
>>> torch.zeros(5 )
tensor([0. , 0. , 0. , 0. , 0. ])
torch.ones
torch.ones(*sizes, out=None) → Tensor #返回一个全为1的张量,形状由可变参数sizes
定义。
view code >>> torch.ones(2 ,3 )
tensor([[1. , 1. , 1. ],
[1. , 1. , 1. ]])
>>> torch.ones(5 )
tensor([1. , 1. , 1. , 1. , 1. ])
torch.from_numpy
torch.from_numpy(ndarray) → Tensor
将numpy.ndarray
转换为Tensor
。 返回的张量tensor和numpy的ndarray共享同一内存空间
。修改一个会导致另外一个也被修改。返回的张量不能调整大小
。
view code >>> a= np.array([1 ,2 ,4 ])
>>> t = torch.from_numpy(a)
>>> t
tensor([1 , 2 , 4 ])
>>> t[1 ]=10
>>> a
array([ 1 , 10 , 4 ])
torch.linspace
torch.linspace(start, end, steps=100, out=None) → Tensor #返回start和end之间长度为steps
的一维张量
参数说明:
start (float)
– 点集的起始值
end (float)
– 点集的最终值
steps (int)
– 在start
和 end
间的采样数,即返回多少个数
out (Tensor, 可选的)
– 结果张量
view code >>> torch.linspace(1.0 ,10 ,steps=5 )
tensor([ 1.0000 , 3.2500 , 5.5000 , 7.7500 , 10.0000 ])
>>> torch.linspace(-10 ,10 ,steps=5 ,out=None )
tensor([-10. , -5. , 0. , 5. , 10. ])
torch.logspace
torch.logspace(start, end, steps=100, out=None) → Tensor
返回一个1维张量,包含在区间10 s t a r t 10 s t a r t 和10 e n d 10 e n d 上以对数刻度均匀间隔的steps
个点。 输出1维张量的长度为steps
,参数说明同torch.linspace
view code >>> torch.logspace(start=-10 ,end=10 ,steps=5 )
tensor([1.0000e-10 , 1.0000e-05 , 1.0000e+00 , 1.0000e+05 , 1.0000e+10 ])
>>> torch.logspace(start=0.1 ,end=1.0 ,steps=5 )
tensor([ 1.2589 , 2.1135 , 3.5481 , 5.9566 , 10.0000 ])
torch.FloatTensor
此变量用于生成数据类型为浮点型的Tensor,传递给torch.FloatTensor的参数可以是一个列表,也可以是一个维度值。torch.IntTensor与此类似。
view code >>> import torch
>>> a = torch.FloatTensor(2 ,3 )
>>> print (a)
-0.1171 0.0000 -0.1171
0.0000 0.0000 0.0000
[torch.FloatTensor of size 2x3]
>>> b = torch.FloatTensor([2 ,3 ,4 ,5 ])
>>> print (b)
2
3
4
5
[torch.FloatTensor of size 4 ]
torch.rand
用于生成数据类型为浮点型且维度指定
的随机Tensor,和在Numpy中使用numpy.rand生成随机数的方法类似,随机生成的浮点数据在0~1区间均匀分布
。
torch.rand(*sizes, out=None) → Tensor
返回一个张量,填充在[0,1]区间的一组均匀分布随机数。 Tensor的形状由变量sizes
定义。
view code >>> torch.rand(4 )
tensor([0.0662 , 0.7079 , 0.4197 , 0.2257 ])
>>> torch.rand(2 ,3 ,out=None )
tensor([[0.8174 , 0.8959 , 0.2713 ],
[0.5343 , 0.0275 , 0.7712 ]])
>>> torch.rand(2 ,3 )
torch.randn
torch.randn(*sizes, out=None) → Tensor
用于生成数据类型为浮点型且维度指定
的随机Tensor,和在Numpy中使用numpy.randn生成随机数的方法类似,随机生成的浮点数的取值满足均值为0,方差为1的正态分布
。
view code >>> torch.randn(4 )
tensor([-1.4524 , 0.9949 , -1.4038 , 0.8059 ])
>>> torch.randn(2 ,3 )
tensor([[ 0.9186 , 1.0356 , 1.1103 ],
[-2.0057 , -0.9032 , 0.6453 ]])
torch.randperm
torch.randperm(n, out=None) → LongTensor
输入参数n(int) – 上限(独占),即最大值
,返回一个从0
到n -1
的随机整数排列,随机打散。
random.shuffle
view code >>> torch.randperm(4 )
tensor([3 , 1 , 2 , 0 ])
>>> a=torch.rand(2 ,3 )
>>> b=torch.rand(2 ,2 )
>>> idx=torch.randperm(2 )
>>> idx
tensor([1 , 0 ])
>>> idx
tensor([1 , 0 ])
>>> a,b
(tensor([[0.8094 , 0.8389 , 0.5666 ],
[0.6812 , 0.5959 , 0.4951 ]]), tensor([[0.4863 , 0.5345 ],
[0.1246 , 0.2468 ]]))
>>> a[idx]
tensor([[0.6812 , 0.5959 , 0.4951 ],
[0.8094 , 0.8389 , 0.5666 ]])
>>> b[idx]
tensor([[0.1246 , 0.2468 ],
[0.4863 , 0.5345 ]])
torch.arange
torch.arange(start, end, step=1, out=None) → Tensor([start;end))
返回一个1维张量,长度为floor((end−start)/step),floor代表向下取整。包含从start
到end
,以step
为步长的一组序列值(默认步长为1)。
view code >>> torch.arange(1 ,4 )
tensor([1 , 2 , 3 ])
>>> torch.arange(1 ,2.5 ,0.5 )
tensor([1.0000 , 1.5000 , 2.0000 ])
torch.range
torch.range(start, end, step=1, out=None) → Tensor([start;end]),现在torch.range将要废弃,
返回一个1维张量,长度为floor((end−start)/step)+1,其中floor代表向下取整数。从start
开始,end
为结尾,以step
为步长的一组值。 step
是两个值之间的间隔,即 Xi+1=Xi+step
view code >>> import torch
>>> a = torch.range (2 ,8 ,1 )
__main__:1 : UserWarning: torch.range is deprecated in favor of torch.arange and will be removed in 0.5 . Note that arange generates values in [start; end), not [start; end].
>>> print (a)
tensor([2. , 3. , 4. , 5. , 6. , 7. , 8. ])
torch.full
view code >>> torch.full([2 ,3 ],7 )
tensor([[7. , 7. , 7. ],
[7. , 7. , 7. ]])
>>> torch.full([],7 )
tensor(7. )
>>> torch.full([1 ],7 )
tensor([7. ])
>>> torch.full([2 ],7 )
tensor([7. , 7. ])
3.Indexing, Slicing, Joining, Mutating Ops
dim 0 first
select first/last N
select by steps
select by specific index
...
dim 0 first
view code >>> a = torch.rand(4 ,3 ,28 ,28 )
>>> a[0 ].shape
torch.Size([3 , 28 , 28 ])
>>> a[0 ,0 ].shape
torch.Size([28 , 28 ])
>>> a[0 ,0 ,2 ,4 ]
tensor(0.2409 )
select first/last N
view code >>> a[:2 ].shape
torch.Size([2 , 3 , 28 , 28 ])
>>> a[:2 ,:1 ,:,:].shape
torch.Size([2 , 1 , 28 , 28 ])
>>> a[:2 ,1 :,:,:].shape
torch.Size([2 , 2 , 28 , 28 ])
>>> a[:2 ,-1 :,:,:].shape
torch.Size([2 , 1 , 28 , 28 ])
select by steps
view code >>> a[:,:,0 :28 :2 ,:].shape
torch.Size([4 , 3 , 14 , 28 ])
>>> a[:,:,0 :28 :2 ,0 :14 ].shape
torch.Size([4 , 3 , 14 , 14 ])
>>> a[:,:,0 :28 :2 ,2 :14 ].shape
torch.Size([4 , 3 , 14 , 12 ])
通用形式:start : end : step
select by specific index
torch.index_select
torch.index_select(input, dim, index, out=None ) → Tensor
参数:
input (Tensor) – 输入张量
dim (int) – 索引的轴
index (LongTensor) – 包含索引下标的一维张量
out (Tensor, optional) – 目标张量
沿着指定维度对输入进行切片,取index
中指定的相应项(index
为一个LongTensor),然后返回到一个新的张量, 返回的张量与原始张量_Tensor_有相同的维度(在指定轴上)。
注意: 返回的张量不与原始张量共享内存空间。
view code >>> x=torch.randn(3 ,4 )
>>> x
tensor([[ 0.4878 , -0.7477 , -0.2496 , 1.1835 ],
[-1.8953 , 0.3530 , 0.1122 , 0.9137 ],
[ 0.4686 , 0.5230 , -1.1191 , -1.0911 ]])
>>> indices = torch.LongTensor([0 ,2 ])
>>> indices
tensor([0 , 2 ])
>>> torch.index_select(x,1 ,indices)
tensor([[ 0.4878 , -0.2496 ],
[-1.8953 , 0.1122 ],
[ 0.4686 , -1.1191 ]])
>>> torch.index_select(x,1 ,indices)
tensor([[ 0.4878 , -0.2496 ],
[-1.8953 , 0.1122 ],
[ 0.4686 , -1.1191 ]])
>>> torch.index_select(x,0 ,indices)
tensor([[ 0.4878 , -0.7477 , -0.2496 , 1.1835 ],
[ 0.4686 , 0.5230 , -1.1191 , -1.0911 ]])
...
view code >>> a.shape
torch.Size([4 , 3 , 28 , 28 ])
>>> a[...].shape
torch.Size([4 , 3 , 28 , 28 ])
>>> a[0 ,...].shape
torch.Size([3 , 28 , 28 ])
>>> a[:,1 ,...].shape
torch.Size([4 , 28 , 28 ])
>>> a[0 ,...,::2 ].shape
torch.Size([3 , 28 , 14 ])
>>> a[...,:2 ].shape
torch.Size([4 , 3 , 28 , 2 ])
select by mask
torch.masked_select
torch.masked_select(input, mask, out=None ) → Tensor
input (Tensor) – 输入张量
mask (ByteTensor) – 掩码张量,包含了二元索引值
out (Tensor, optional) – 目标张量
根据掩码张量mask
中的二元值,取输入张量中的指定项( mask
为一个 ByteTensor ),将取值返回到一个新的1D张量,
张量 mask
须跟input
张量有相同数量的元素数目,但形状或维度不需要相同。 注意: 返回的张量不与原始张量共享内存空间。
view code >>> x = torch.randn(3 ,4 )
>>> x
tensor([[ 0.3132 , -0.4580 , -0.3642 , 0.7394 ],
[-0.2821 , 1.9086 , -0.9687 , 1.6009 ],
[ 0.9800 , -0.8546 , -0.8855 , -0.3807 ]])
>>> mask = x.ge(0.5 )
>>> mask
tensor([[False , False , False , True ],
[False , True , False , True ],
[ True , False , False , False ]])
>>> torch.masked_select(x,mask)
tensor([0.7394 , 1.9086 , 1.6009 , 0.9800 ])
>>> torch.masked_select(x,mask).shape
torch.Size([4 ])
select by flatten index
view code >>> src = torch.tensor([[4 ,3 ,5 ],[6 ,7 ,8 ]])
>>> torch.take(src,torch.tensor([0 ,2 ,5 ]))
tensor([4 , 5 , 8 ])
torch.nonzero
torch.nonzero(input, out=None ) → LongTensor
参数:
input (Tensor) – 源张量
out (LongTensor, optional) – 包含索引值的结果张量
返回一个包含输入input
中非零元素索引的张量。输出张量中的每行包含输入中非零元素的索引。如果输入input
有n
维,则输出的索引张量output
的形状为 z x n, 这里 z 是输入张量input
中所有非零元素的个数。
view code >>> torch.nonzero(torch.Tensor([1 ,1 ,1 ,0 ,1 ]))
tensor([[0 ],
[1 ],
[2 ],
[4 ]])
>>> torch.nonzero(torch.Tensor([[0.6 ,0.0 ,0.0 ,0.0 ],[0.0 ,0.4 ,0.0 ,0.0 ],[0.0 ,0.0 ,1.2 ,0.0 ],[0.0 ,0.0 ,5 ,0.0 ]]))
tensor([[0 , 0 ],
[1 , 1 ],
[2 , 2 ],
[3 , 2 ]])
维度变换
view/reshape(view保证numel不变即可)
Squeeze/unsqueeze(删减/增加)
Transpose/t/permute
Expand/repeat
torch.view/torch.reshape
view操作需保证数据有实际意义,不然会将数据造成破坏,数据的存储、维度顺序非常重要
view code >>> a=torch.rand(4 ,1 ,28 ,28 )
>>> a.view(4 ,28 *28 )
tensor([[0.2301 , 0.9408 , 0.3547 , ..., 0.9387 , 0.0988 , 0.9476 ],
[0.2724 , 0.6440 , 0.0037 , ..., 0.7575 , 0.1136 , 0.7190 ],
[0.6347 , 0.9259 , 0.4316 , ..., 0.8456 , 0.2670 , 0.6662 ],
[0.0801 , 0.3157 , 0.4126 , ..., 0.4852 , 0.2193 , 0.8381 ]])
>>> a.view(4 ,28 *28 ).shape
torch.Size([4 , 784 ])
>>> a.view(4 *28 ,28 ).shape
torch.Size([112 , 28 ])
>>> a.view(4 *1 ,28 ,28 ).shape
torch.Size([4 , 28 , 28 ])
>>> b=a.view(4 ,784 )
>>> b.view(4 ,28 ,28 ,1 )
tensor([[[[0.2301 ],
[0.9408 ],
[0.3547 ],
...,
[0.4852 ],
[0.2193 ],
[0.8381 ]]]])
torch.unsqueeze
torch.unsqueeze(input, dim, out=None )
参数:
tensor (Tensor) – 输入张量
dim (int) – 插入维度的索引
out (Tensor, optional) – 结果张量
返回一个新的张量,对输入的指定位置插入维度。注意: 返回张量与输入张量共享内存,所以改变其中一个的内容会改变另一个。如果dim
为负,则将会被转化dim+input.dim()+1,指定位置在 1[-a.dim()-1,a.dim()+1]=>[-5,5]之间变化。
view code >>> a.shape
torch.Size([4 , 1 , 28 , 28 ])
>>> a.unsqueeze(0 ).shape
torch.Size([1 , 4 , 1 , 28 , 28 ])
>>> a.unsqueeze(-1 ).shape
torch.Size([4 , 1 , 28 , 28 , 1 ])
>>> a.unsqueeze(-4 ).shape
torch.Size([4 , 1 , 1 , 28 , 28 ])
>>>
>>> a.unsqueeze(-5 ).shape
torch.Size([1 , 4 , 1 , 28 , 28 ])
>>> a.unsqueeze(5 ).shape
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
IndexError: Dimension out of range (expected to be in range of [-5 , 4 ], but got 5 )
>>> a=torch.tensor([1.2 ,2.3 ])
>>> a.unsqueeze(-1 )
tensor([[1.2000 ],
[2.3000 ]])
>>> a.unsqueeze(0 )
tensor([[1.2000 , 2.3000 ]])
example:
view code >>> b=torch.rand(32 )
>>> f=torch.rand(4 ,32 ,14 ,14 )
>>> b=b.unsqueeze(1 ).unsqueeze(2 ).unsqueeze(0 )
>>> b.shape
torch.Size([1 , 32 , 1 , 1 ])
torch.squeeze
view code >>> b.shape
torch.Size([1 , 32 , 1 , 1 ])
>>> b.squeeze().shape
torch.Size([32 ])
>>> b.squeeze(0 ).shape
torch.Size([32 , 1 , 1 ])
>>> b.shape
torch.Size([1 , 32 , 1 , 1 ])
>>> b.squeeze(-1 ).shape
torch.Size([1 , 32 , 1 ])
>>> b.squeeze(1 ).shape
torch.Size([1 , 32 , 1 , 1 ])
>>> b.squeeze(-4 ).shape
torch.Size([32 , 1 , 1 ])
torch.unbind
torch.unbind(tensor, dim=0)[source]
参数:
tensor (Tensor) – 输入张量
dim (int) – 删除的维度
移除指定维后,返回一个元组,包含了沿着指定维切片后的各个切片
torch.expand/torch.repeat
Expand:broadcasting【不会主动复制数据,只在需要的时候,这是推荐的一种方式;进行操作的时候需要前后dim一致,只能从dim1->dimN;-1表示dim不变】
Repeat:memory copied(给出的参数p为在相应的维度上拷贝p次)
view code
>>> a=torch.rand(4 ,32 ,14 ,14 )
>>> b.shape
torch.Size([1 , 32 , 1 , 1 ])
>>> b.expand(4 ,32 ,14 ,14 ).shape
torch.Size([4 , 32 , 14 , 14 ])
>>> b.expand(-1 ,32 ,-1 ,-1 ).shape
torch.Size([1 , 32 , 1 , 1 ])
>>> b.expand(-1 ,32 ,-1 ,-4 ).shape
torch.Size([1 , 32 , 1 , -4 ])
>>> b.shape
torch.Size([1 , 32 , 1 , 1 ])
>>> b.repeat(4 ,32 ,1 ,1 ).shape
torch.Size([4 , 1024 , 1 , 1 ])
>>> b.repeat(4 ,1 ,1 ,1 ).shape
torch.Size([4 , 32 , 1 , 1 ])
>>> b.repeat(4 ,1 ,32 ,32 ).shape
torch.Size([4 , 32 , 32 , 32 ])
torch.t
torch.t(input, out=None ) → Tensor
参数:
input (Tensor) – 输入张量
out (Tensor, optional) – 结果张量
输入一个矩阵(2维张量),并转置0, 1维。 可以被视为函数transpose(input, 0, 1)
的简写函数,但是torch.t只适用于2D。
torch.transpose
torch.transpose(input, dim0, dim1, out=None ) → Tensor
input (Tensor) – 输入张量
dim0 (int) – 转置的第一维
dim1 (int) – 转置的第二维
返回输入矩阵input
的转置。交换维度dim0
和dim1
。 输出张量与输入张量共享内存,所以改变其中一个会导致另外一个也被修改。高维矩阵的转置常用torch.transpose
view code >>> a=torch.rand(4 ,3 ,32 ,32 )
>>> a1.shape
torch.Size([4 , 32 , 32 , 3 ])
>>> a1 = a.transpose(1 ,3 ).view(4 ,3 *32 *32 ).view(4 ,3 ,32 ,32 )
Traceback (most recent call last):
File "<stdin>" , line 1 , in <module>
RuntimeError: view size is not compatible with input tensor's size and stride (at least one dimension spans across two contiguous subspaces). Use .reshape(...) instead.
>>> a1 = a.transpose(1,3).contiguous().view(4,3*32*32).view(4,3,32,32) #contiguous将数据变为连续,同上,维度污染,错误
>>> a2 = a.transpose(1,3).contiguous().view(4,3*32*32).view(4,32,32,3).transpose(1,3)
>>> a1.shape,a2.shape
(torch.Size([4, 3, 32, 32]), torch.Size([4, 3, 32, 32]))
>>> torch.all(torch.eq(a,a1))
tensor(False)
>>> torch.all(torch.eq(a,a2))
tensor(True)
permute
permute()参数信息是原来Tensor的维度信息
[b,h,w,c]是numpy存储图片的格式,只有这个格式才能导出numpy
view code >>> a=torch.rand(4 ,3 ,28 ,28 )
>>> a.transpose(1 ,3 ).shape
torch.Size([4 , 28 , 28 , 3 ])
>>> b=torch.rand(4 ,3 ,28 ,32 )
>>> b.transpose(1 ,3 ).shape
torch.Size([4 , 32 , 28 , 3 ])
>>> b.transpose(1 ,3 ).shape
torch.Size([4 , 32 , 28 , 3 ])
>>> b.permute(0 ,2 ,3 ,1 ).shape
torch.Size([4 , 28 , 32 , 3 ])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)