1.Pytorch中tensor的生成与访问
可以使用arange()创建一个张量:如,torch.arange(12)创建0开始的前12个整数:
除非特殊指定,否则新的张量将存放在内存中,并采用CPU计算。
可以使用reshape()来改变张量的形状:
注意,reshape()的发起者是一个张量,比如这里的x.reshape(),x是一个张量。reshape操作只改变张量的形状,
并不改变张量的大小(元素的数量)以及张量中的值。还可以用x.reshape(-1,4)或x.reshape(3,-1)实现x.reshape(3,4)
同样的功能。
使用tensor.zeros()创建全0的tensor,括号内指定该全0的tensor的形状,如:
上面的例子创建了一个形状为(2,3,4)的tensor。全1同理:
使用torch.randn()创建均值为0,方差为1的标准正态分布张量,括号内同样是指定张量的形状,如:
还可以用python的列表来为张量指定值和形状,写法为:torch.tensor() :
可以使用torch.zeros_like(y)创建与y同形状的全0张量:
可以使用shape查看张量的形状:
注意,shape的发起者一定也是张量。比如这里的x.reshape(3,4)是shape动作的发起者,它是一个三行四列的张量。
2.Tensor的基本计算
加、减、乘、除、乘方、幂指这些运算,都可以直接用在张量上,表示按元素的计算(element-wise):
使用torch.exp()对张量的每一个元素做以e为底的幂指运算,括号内是某个张量:
使用torch.cat()拼接两个张量。括号中指出要拼接的两个张量以及dim的值,dim=0是竖着拼,dim=1是横着拼:
使用“==”对张量中的每一个数值判等,运算结果是一个布尔值构成的张量:
对张量中的所有元素进行求和,会产生一个单元素张量:
广播机制如下面的例子:
矩阵a将复制自身的列,矩阵b将复制自身的行,然后对应元素相加。
可以使用索引来访问tensor的元素,下面的例子中,X的是2维的,它的每一个元素是一个向量,X[0]访问第一个向量,
X[0,0]访问第一个向量中的第一个值:
特别地,可以用-1访问最后一个元素,用冒号":"进行连续访问:
这里面的"1:3"表示访问“下标”为1的元素(即第二个元素)开始的,连续的元素,一直到下标为3的元素(不包括3,前闭后开)。
还有以下的用法,将矩阵后两行全部赋值0:
将矩阵所有元素赋值0:
3.一个节省内存的方法
在为张量更新值的时候,如果只是简单的使用“x = expression”这样更新,则会为x分配一个新的内存。这样有两个不好的地方:
1. 机器学习中数据量很大,节约内存是有必要的。
2. 如果我们不原地更新,其他引用仍然可能指向旧的内存,这样可能会导致某些代码指向旧的参数。
原地更新的方法是:使用如x += 1代替x = x + 1 或使用切片:
4.Tensor与其他Python对象的转换
Pytorch的张量与Numpy的张量(ndarray)很容易相互转换:
Pytorch的只有一个元素,大小为1的张量同样可以很轻松地转换为python标量,可以使用item()函数,或强制类型转换,
如float(),int()等:
标签:torch,tensor,reshape,元素,张量,Pytorch,使用,操作,数据 From: https://www.cnblogs.com/pkuqcy/p/17375198.html