玩命加载中 . . .

PyTorch教程-1


查看torch版本号

print(torch.__version__)
# 1.9.1+cu111

张量初始化

(1) 直接从数据初始化

data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
print(x_data)
# tensor([[1, 2],
#         [3, 4]])

(2) 从numpy初始化

np_array = np.array(data)
print(np_array)
# [[1 2]
#  [3 4]]
x_np = torch.from_numpy(np_array)
print(x_np)
# tensor([[1, 2],
#         [3, 4]], dtype=torch.int32)

(3) 从另一个张量初始化

ones_like会保持和原始数据同样的大小,数值替换为1
指定dtype可以修改数据类型

x_ones = torch.ones_like(x_data) # 返回的tensor默认具有相同的torch.dtype和torch.device
print(f"Ones Tensor: \n {x_ones} \n")
# Ones Tensor: 
#  tensor([[1, 1],
#         [1, 1]]) 

x_rand = torch.rand_like(x_data, dtype=torch.float) # 指定新的数据类型
print(f"Random Tensor: \n {x_rand} \n")
# Random Tensor: 
#  tensor([[0.5542, 0.4023],
#         [0.5633, 0.9819]]) 

(4) 指定大小创建

shape = (2, 3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
# Random Tensor: 
#  tensor([[0.5704, 0.2910, 0.4899],
#         [0.9169, 0.8592, 0.7099]]) 

print(f"Ones Tensor: \n {ones_tensor} \n")
# Ones Tensor: 
#  tensor([[1., 1., 1.],
#         [1., 1., 1.]]) 

print(f"Zeros Tensor: \n {zeros_tensor}")
# Zeros Tensor: 
#  tensor([[0., 0., 0.],
#         [0., 0., 0.]])

张量属性

  • shape:张量大小
  • dtype:张量数据类型
  • device:存储在什么设备上
tensor = torch.rand(3, 4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
# Shape of tensor: torch.Size([3, 4])
# Datatype of tensor: torch.float32
# Device tensor is stored on: cpu

张量操作

(1) 移动到GPU

if torch.cuda.is_available():
  tensor = tensor.to('cuda')
  print(f"Device tensor is stored on: {tensor.device}")
# Device tensor is stored on: cuda:0

(2) 和numpy类似的索引

第1列赋值为0

tensor = torch.ones(4, 4)
tensor[:,1] = 0
print(tensor)
# tensor([[1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.]])

(3) 连接多个张量

按列连接

t1 = torch.cat([tensor, tensor, tensor], dim=0)
print(t1)
# tensor([[1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.]])

按行连接

t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
# tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
#         [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
#         [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
#         [1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])

(4) 张量相乘

对应元素相乘

print(f"tensor.mul(tensor) \n {tensor.mul(tensor)} \n")
# tensor.mul(tensor) 
#  tensor([[1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.]]) 

print(f"tensor * tensor \n {tensor * tensor}")
# tensor * tensor 
#  tensor([[1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.]])

矩阵乘法

print(f"tensor.matmul(tensor.T) \n {tensor.matmul(tensor.T)} \n")
# tensor.matmul(tensor.T) 
#  tensor([[3., 3., 3., 3.],
#         [3., 3., 3., 3.],
#         [3., 3., 3., 3.],
#         [3., 3., 3., 3.]]) 
print(f"tensor @ tensor.T \n {tensor @ tensor.T}")
# tensor @ tensor.T 
#  tensor([[3., 3., 3., 3.],
#         [3., 3., 3., 3.],
#         [3., 3., 3., 3.],
#         [3., 3., 3., 3.]])

(5) 直接更改元素

print(tensor, "\n")
# tensor([[1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.],
#         [1., 0., 1., 1.]]) 

tensor.add_(5)
print(tensor)
# tensor([[6., 5., 6., 6.],
#         [6., 5., 6., 6.],
#         [6., 5., 6., 6.],
#         [6., 5., 6., 6.]])

PyTorch操作inplace版本都有后缀_, 例如x.copy_(y), x.t_()

与numpy的转换

t = torch.ones(5)
print(f"t: {t}")
# t: tensor([1., 1., 1., 1., 1.])
n = t.numpy()
print(f"n: {n}")
# n: [1. 1. 1. 1. 1.]

张量与numpy共享存储空间,tensor改变,numpy也会改变

t.add_(1)
print(f"t: {t}")
# t: tensor([2., 2., 2., 2., 2.])
print(f"n: {n}")
# n: [2. 2. 2. 2. 2.]

numpy转为tensor

n = np.ones(5)
print(f"n: {n}")
# n: [1. 1. 1. 1. 1.]
t = torch.from_numpy(n)
print(f"t: {t}")
# t: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)

np.add(n, 1, out=n)
print(f"n: {n}")
# n: [2. 2. 2. 2. 2.]
print(f"t: {t}")
# t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录