pyhton深度学习基于pytorch——创建Tensor和修改Tensor形状

2022年12月29日08:55:28

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

  • 作者:醉Dowry
  • 原文链接:https://coco-dowry.blog.csdn.net/article/details/124767727
    更新时间:2022年12月29日08:55:28 ,共 2618 字。