目录
(1)创建一个64位浮点型且指定矩阵值为[1,2],[3,4],[5,6]的矩阵:
Pytorch最基本的操作对象是张量,张量的英文是Tensor
一、张量常用的数据类型:
这里的数据类型可以理解是指此类型的张量的元素支持此类型的数据,就如32位浮点型张量,其元素数据类型就是32位的浮点数
数据类型
含义
torch.FloatTensor
32位浮点型(默认类型)
torch.DoubleTensor
64位浮点型
torch.ShortTensor
16位整型
torch.IntTensor
32位整型
torch.LongTensor
64位整型
二、Tensor的创建
(1)创建一个64位浮点型且指定矩阵值为[1,2],[3,4],[5,6]的矩阵:
import torch as t
a=t.DoubleTensor([[1,2],[3,4],[5,6]])
print(a)
在这里的 t.DoubleTensor() 可以换成其他类型,是一样的方法
运行结果:
tensor([[1., 2.],
[3., 4.],
[5., 6.]], dtype=torch.float64)
(2)创建一个仅指定形状未赋值的Tensor:
import torch as t
a=t.Tensor(3,2)
print(a)
运行结果:
tensor([[1.8524e+28, 7.5034e+28],
[1.2695e+31, 1.7225e+22],
[4.5925e+24, 1.7448e+22]])
提醒:系统不会马上给这个Tensor分配空间,使用时才会分配,分配空间大小取决于内存空间的状态
(3)依据另一个Tensor的形状创建Tensor
import torch as t
a=t.Tensor(3,2)
b=t.Tensor(a.size())
print("a={}\nb={}".format(a,b))
运行结果:
a=tensor([[1.2102e+25, 4.5437e+30],
[4.5145e+27, 1.3556e-19],
[1.3563e-19, 1.4587e-19]])
b=tensor([[7.2251e+28, 4.7987e+30],
[1.5793e-19, 1.1703e-19],
[1.3563e-19, 1.9517e-19]])
(4)还有一些常用的创建Tensor的方法:
方法
效果
torch.empty(size):
返回形状为size的空Tensor
torch.zeros(size):
返回形状为size、元素全部是0的Tensor
torch.zeros_like(input):
返回与input相同形状的、元素全部是0的Tensor
torch.ones(size)
返回形状为size、元素全部是1的Tensor
torch.ones_like(input)
返回与input相同形状的、元素全部是1的Tensor
torch.rand(size)
返回形状为size、元素为一组在[0,1)内满足均匀分布的随机数的Tensor
torch.randn(size)
返回形状为size、元素为一组满足标准正态分布(均值为0,方差为1)的随机数的Tensor
torch.eye(size)
返回形状为size、对角线元素全部是1的Tensor
torch.randperm(int)
返回形状为1*int,元素为0~int内不重复的整型Tensor
torch.arange(size)
返回一个元素为范围内随机数的Tensor,详见示例
示例:
import torch as t
a=t.empty(3,2)
b=t.zeros(2,3)
c=t.zeros(5,3,dtype=t.long)
d=t.zeros_like(c)
e=t.ones(2,3)
f=t.ones_like(e)
g=t.rand(3,2)
h=t.randn(2,3)
i=t.eye(3,3)
j=t.randperm(5)
k=t.arange(1,8,2)
print("a=={}\nb=={}\nc=={}\nd=={}\ne=={}\nf=={}\ng=={}\nh=={}\ni=={}\nj=={}\nk=={}\n".format(a,b,c,d,e,f,g,h,i,j,k))
运行结果:
a==tensor([[0., 0.],
[0., 0.],
[0., 0.]])
b==tensor([[0., 0., 0.],
[0., 0., 0.]])
c==tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
d==tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
e==tensor([[1., 1., 1.],
[1., 1., 1.]])
f==tensor([[1., 1., 1.],
[1., 1., 1.]])
g==tensor([[0.1040, 0.9542],
[0.5337, 0.0391],
[0.3123, 0.1004]])
h==tensor([[ 1.3699, 0.1626, 0.2756],
[-1.6842, -1.8627, 0.4473]])
i==tensor([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
j==tensor([2, 4, 0, 1, 3])
k==tensor([1, 3, 5, 7])
三、Tensor的尺寸、数据类型、长度查看
size()函数或shape属性:查看Tensor尺寸
dtype属性:查看Tensor数据类型
numel()函数:查看Tensor元素个数
示例:
import torch as t
a=t.Tensor([[2,2],[1,4],[6,6]])
print("a==",a)
print("a.size()==",a.size())
print("a.shape==",a.shape)
print("a.dtype==",a.dtype)
print("a.numel==",a.numel())
运行结果:
a== tensor([[2., 2.],
[1., 4.],
[6., 6.]])
a.size()== torch.Size([3, 2])
a.shape== torch.Size([3, 2])
a.dtype== torch.float32
a.numel== 6
四、Tensor的形状调整
相关函数:
(1、torch.view(size)函数将其调整成形状为size的Tensor,元素数量在形状调整前后不变,即一个元素个数为8的Tensor,调整后也应为8,详见示例4.1。
(2、torch.resize_()函数是另一种用来调整Tensor形状的方法,但与torch.view()不同,它可以修改Tensor的尺寸。如果新尺寸超过原尺寸,则它会为Tensor自动分配新的内存空间,而如果新尺寸小于原尺寸,则原有的数据依旧会被保存,详见示例4.2。
示例4.1:
import torch as t
a=t.arange(0,8).view(2,4)
print(a)
运行结果:
tensor([[0, 1, 2, 3],
[4, 5, 6, 7]])
小结:上述示例1可以理解为先创建一个二阶张量,长度为6,元素为0~8,然后用torch.view(size)函数将其调整成形状为2*4的Tensor
与分开书写等价:
import torch as t
a=t.arange(0,8).view(2,4)
b=t.arange(0,8)
c=b.view(2,4)
print(a)
print(c)
运行结果:
tensor([[0, 1, 2, 3],
[4, 5, 6, 7]])
tensor([[0, 1, 2, 3],
[4, 5, 6, 7]])
示例4.2
import torch as t
a=t.arange(0,4)
print("a==\n{}\n".format(a))
b=a.view(2,2)
print("b=a.view(2,2)==\n{}\n".format(b))
b.resize_(1,3)
print("a.view(2,2).resize_(1,3)==\n{}\n".format(b))
c=b.resize_(3,3)
print("a.view(2,2).resize_(1,3).resize_(3,3)==\n{}\n".format(c))
运行结果:
a==
tensor([0, 1, 2, 3])
b=a.view(2,2)==
tensor([[0, 1],
[2, 3]])
a.view(2,2).resize_(1,3)==
tensor([[0, 1, 2]])
a.view(2,2).resize_(1,3).resize_(3,3)==
tensor([[ 0, 1, 2],
[ 3, 0, 1381737846192],
[ 102, 93, 0]])
五、Tensor的加、减、乘、除、求幂、求绝对值
在深度学习里难免会有对Tensor进行加、减、乘、除、求幂、求绝对值等运算
示例5.1:
import torch as t
a=t.Tensor([[1,2],[3,4]])
b=t.Tensor([[5,6],[7,8]])
print("a加b==",t.add(a,b))
print("a减b==",t.sub(a,b))
print("a乘b==",t.mul(a,b))
print("a除b==",t.div(a,b))
print("a的2次幂==",t.pow(a,2))
print("b的绝对值==",t.abs(b))
运行结果:
a加b== tensor([[ 6., 8.],
[10., 12.]])
a减b== tensor([[-4., -4.],
[-4., -4.]])
a乘b== tensor([[ 5., 12.],
[21., 32.]])
a除b== tensor([[0.2000, 0.3333],
[0.4286, 0.5000]])
a的2次幂== tensor([[ 1., 4.],
[ 9., 16.]])
b的绝对值== tensor([[5., 6.],
[7., 8.]])
除了上面的简单运算,还有一些常用的Tensor的三角函数运算:
示例5.2
import torch as t
a=t.Tensor([-1.2027,2,0.4412,-1.3856])
tan=t.tan(a)
cos=t.cos(a)
sin=t.sin(a)
print("a的正切:",tan)
print("a的余弦:",cos)
print("a的正弦:",sin)
运行结果:
a的正切: tensor([-2.5929, -2.1850, 0.4722, -5.3378])
a的余弦: tensor([ 0.3598, -0.4161, 0.9042, 0.1841])
a的正弦: tensor([-0.9330, 0.9093, 0.4270, -0.9829])
六、Tensor间比较
1、touch.equal()函数
touch.equal(a,b,out=None)函数:若两个tensor(a和b)形状和元素相同则返回True,否则返回False
示例6.1:
import torch as t
a=t.Tensor([1,2])
b=t.Tensor([1,4])
print(t.equal(a,b))
运行结果:
False
2、touch.gt()、touch.ge()
touch.gt(input,other,out=None)函数:逐个元素比较,若input大于other,则返回True,否则返回False
touch.ge(input,other,out=None)函数:逐个元素比较,若input大于等于other,则返回True,否则返回False
示例6.2:
import torch as t
a=t.Tensor([[1,2],[3,4]])
b=t.Tensor([[1,3],[2,4]])
print("t.gt(a,b)=={}\nt.gt(a,2.5)=={}\nt.ge(a,b)=={}\n".format(t.gt(a,b),t.gt(a,2.5),t.ge(a,b)))
运行结果:
t.gt(a,b)==tensor([[False, False],
[ True, False]])
t.gt(a,2.5)==tensor([[False, False],
[ True, True]])
t.ge(a,b)==tensor([[ True, False],
[ True, True]])
七、tensor元素的最大、最小、和、平均数
相关函数:
torch.max(tensor):返回tensor中最大的元素。
torch.min(tensor):返回tensor中最小的元素。
torch.sum(tensor):返回tensor中所有元素的和。
torch.mean(tensor):返回tensor中所有元素的平均数
示例:
import torch as t
tensor=t.arange(1,8,dtype=t.float)
print(tensor)
max=t.max(tensor)
min=t.min(tensor)
sum=t.sum(tensor)
mean=t.mean(tensor)
print("tensor的最大值是:{}\ntensor的最小值是:{}\ntensor的元素和是:{}\ntensor的元素均值是:{}\n".format(max,min,sum,mean))
运行结果:
tensor([1., 2., 3., 4., 5., 6., 7.])
tensor的最大值是:7.0
tensor的最小值是:1.0
tensor的元素和是:28.0
tensor的元素均值是:4.0
易错提醒:
代码中tensor=t.arange(1,8,dtype=t.float)要记得说明数据类型为float,不然touch.mean()函数会报错,错误如下:
RuntimeError: mean(): could not infer output dtype. Input dtype must be either a floating point or complex dtype. Got: Long
八、Tensor与NumPy数组间互相装换
1、Tensor转NumPy
import torch as t
tensor=t.arange(1,8)
numpy=tensor.numpy()
print("转换前:{}\n装换后:{}{}\n".format(tensor,numpy,type(numpy)))
运行结果:
转换前:tensor([1, 2, 3, 4, 5, 6, 7])
装换后:[1 2 3 4 5 6 7]<class 'numpy.ndarray'>
2、NumPy转Tensor
import torch as t
import numpy as np
numpy=np.arange(1,8)
tensor=t.from_numpy(numpy)
print("转换前:{}\n装换后:{}{}\n".format(numpy,tensor,type(tensor)))
运行结果:
转换前:[1 2 3 4 5 6 7]
装换后:tensor([1, 2, 3, 4, 5, 6, 7], dtype=torch.int32)<class 'torch.Tensor'>
3、tensor与numpy数组互转方法总结
Tensor转NumPy:tensor.numpy()
NumPy转Tensor:tensor.from_numpy(numpy)