查看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)