如果对Tensor的概念理解不清楚请参考我的上一篇文章。
先介绍Tensor的.add()和.add_()方法:
1)不修改自身数据,如x.add(y),x的数据不变,返回一个新的tensor。
(2)修改自身数据,如x.add_(y)(运行符带下划线后缀),运算结果存在x中,x被修改。
import torch x=torch.tensor([1,2]) y=torch.tensor([3,4]) z=x.add(y) print(z) print(x) x.add_(y) print(x)
运行结果:
tensor([4, 6])
tensor([1, 2])
tensor([4, 6])
一、创建Tensor
import torch #根据list数据生成tensor aa=torch.Tensor([1,2,3,4,5,6]) print(aa) #tensor([1., 2., 3., 4., 5., 6.]) #根据指定形状生成tensor bb=torch.Tensor(2,3) print(bb) # tensor([[0., 0., 0.], # [0., 0., 0.]]) #根据给定的tensor的形状 t=torch.Tensor([[1,2,3],[4,5,6]]) #查看tensor的形状 t.size() #shape与size()等价方式 t.shape #根据已有形状创建tensor cc=torch.Tensor(t.size()) print(cc) # tensor([[8.4490e-39, 9.6429e-39, 9.2755e-39], # [1.0286e-38, 9.0919e-39, 8.9082e-39]]) #根据一定规则,自动生成tensor的一些例子。 # 生成一个单位矩阵 a=torch.eye(2, 2) print(a) # tensor([[1., 0.], # [0., 1.]]) # 自动生成全是0的矩阵 b=torch.zeros(2, 3) print(b) # tensor([[0., 0., 0.], # [0., 0., 0.]]) # 根据规则生成数据 c=torch.linspace(1, 10, 4) print(c) #tensor([ 1., 4., 7., 10.]) # 生成满足均匀分布随机数 d=torch.rand(2, 3) print(d) # tensor([[0.0198, 0.5116, 0.3734], # [0.0397, 0.4600, 0.7310]]) # 生成满足标准分布随机数 f=torch.randn(2, 3) print(f) # tensor([[ 0.7431, -1.1317, -0.0973], # [ 0.1756, 0.2788, 0.2570]]) # 返回所给数据形状相同,值全为0的张量 e=torch.zeros_like(torch.rand(2, 3)) print(e) # tensor([[0., 0., 0.], # [0., 0., 0.]])
创建的tensor中的数据都是float。
创建tensor使用了tensor()和Tensor()两种方法。
注意torch.Tensor与torch.tensor的几点区别
①torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),torch.tensor从数据中推断数据类型。
②torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是随机初始化的值。
import torch t1=torch.Tensor(1) t2=torch.tensor(1) print("t1的值{},t1的数据类型{}".format(t1,t1.type())) print("t2的值{},t2的数据类型{}".format(t2,t2.type()))
结果:
t1的值tensor([3.5731e-20]),t1的数据类型torch.FloatTensor
t2的值1,t2的数据类型torch.LongTensor
3.5731e-20是随机生成的大小为1的张量。
二、修改Tensor形状
import torch #coco # 生成一个形状为2x3的矩阵 torch.manual_seed(1) x = torch.randn(2, 3) print(x) # tensor([[ 0.6614, 0.2669, 0.0617], # [ 0.6213, -0.4519, -0.1661]]) # 查看矩阵的形状 x.size() # 结果为torch.Size([2, 3]) # 查看x的维度 x.dim() # 结果为2 # 把x变为3x2的矩阵 x.view(3, 2) # 把x展平为1维向量 y = x.view(-1) print(y) # tensor([ 0.6614, 0.2669, 0.0617, 0.6213, -0.4519, -0.1661]) y.shape print(y.shape) # 添加一个维度 z = torch.unsqueeze(y, 0) #输出是6 # 查看z的形状 z.size() # 结果为torch.Size([1, 6]) # 计算Z的元素个数 z.numel() # 结果为6
【说明】torch.view与torch.reshpae的异同
①reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()调用。view()只可由torch.Tensor.view()来调用。
②对于一个将要被view的Tensor,新的size必须与原来的size与stride兼容。否则,在view之前必须调用contiguous()方法。
③同样也是返回与input数据量相同,但形状不同的tensor。若满足view的条件,则不会copy,若不满足,则会copy
④如果您只想重塑张量,请使用torch.reshape。 如果您还关注内存使用情况并希望确保两个张量共享相同的数据,请使用torch.view。
使用contiguous()
如果想要断开这两个变量之间的依赖(x本身是contiguous的),就要使用contiguous()针对x进行变化,感觉上就是我们认为的深拷贝。
当调用contiguous()时,会强制拷贝一份tensor,让它的布局和从头创建的一模一样,但是两个tensor完全没有联系。
下一个:Zookeeper 基本概念