PyTorch中的Tensor

mac2022-06-30  17

Pytorch中,numpy,python风格与深度学习框架及其对应的tensor数据是结合的紧密了一些,更相近了一些,不过使用起来,但是多少还是有些不同的,需要积累。

import torch as T //version==0.3.1

生成一个Tensor(t)

可以与list或numpy中的array互相转化:

t=T.Tensor(int) #是产生一个数组分布 t=T.Tensor(list) t=T.Tensor(np.array) t=T.from_numpy(np.array) list=T.tolist(t) array=t.numpy()

Tensor和np.array共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个变了,另外一个也会随之改变。 所以有些PyTorch没有但numpy有的操作可以以很小的代价进行“曲线救国“ 指定维度的Tensor:

t=T.Tensor(d1,d2,...) t=T.ones(d1,d2,...) t=T.zeros(d1,d2,...) t=T.eye(d1,d2)

由于Tensor的size是一个专门的类型,所以上面的维度也可以由size类型指定。(eye()的参数仅包括1-2个int)

t=T.Tensor(t.size()) t=T.ones(t.size()) //t=T.ones_like(t) t=T.zeros(t.size()) //t=T.zeros_like(t)

均分区间生成Tensor、

t=T.arange(m,n,step_length) //[m,n)中m开始以步长step_length生成 t=T.range(m,n,step_length) //[m,n-1]中m开始以步长step_length生成 t=T.linspace(m,n,step_num) //[m,n]中以m为首项,n为末项,均分区间为step_num段

随机化生成

t=T.rand(t.size()) //均匀分布 t=T.randn(t.size()) //标准正态分布 t=T.normal(mean,std) //size同t.Tensor(),每个数以对应的均值mean和标准差std[i,j,...]正态采样。

新建空Tensor和全值Tensor

t=T.empty(t.size()) t=T.empty_like(t) t=T.full(t.size(),value) t=T.full_like(t,value)

指定不同类型数据的Tensor

Data typeCPU tensorGPU tensor32-bit floating pointT.FloatTensorT.cuda.FloatTensor64-bit floating pointT.DoubleTensorT.cuda.DoubleTensor16-bit floating pointT.HalfTensorT.cuda.HalfTensor8-bit integer (unsigned)T.ByteTensorT.cuda.ByteTensor8-bit integer (signed)T.CharTensorT.cuda.CharTensor16-bit integer (signed)T.ShortTensorT.cuda.ShortTensor32-bit integer (signed)T.IntTensorT.cuda.IntTensor64-bit integer (signed)T.LongTensorT.cuda.LongTensor

观察一个Tensor(t)

t.size() //返回size类型 T.numel(t) //返回总元素个数 t.view(d1,d2,d3....)//维度重整 t.unsqueeze(di) //在di个维度处升维、 t.squeeze(di) //若di维是1,压缩,否则不变。若无参数,压缩所有“1”维 T.cat((t,t,...),di) //按第di的维度按照tuple的格式复制t T.chunk(t,i,di) //在di维上将t分成i份,最后一份的维度不定(若不能整除)

采数据

T.index_select(t, di, indices) //在第di维上将t的indices抽取出来组成新Tensor。 T.masked_select(t, mask) //按照0-1Tensor mask的格式筛选t,返回一维Tensor T.nonzero(t) //输出n×2维Tensor,非零元素的index

指定不同类型数据的Tensor

t.size() //返回size类型 T.numel(t) //返回总元素个数 t.view(d1,d2,d3....)//维度重整 t.unsqueeze(di) //在di个维度处升维、 t.squeeze(di) //若di维是1,压缩,否则不变。若无参数,压缩所有“1”维 T.cat((t,t,...),di) //按第di的维度按照tuple的格式复制t T.chunk(t,i,di) //在di维上将t分成i份,最后一份的维度不定(若不能整除)

一些数学功能类似于numpy,这里就不再赘述了,边用边整理吧。

最新回复(0)