如果对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完全没有联系。