这是我在pytorch官网下,入门pytorch的入门笔记。
适合已经装好了pytorch,但还不会使用的朋友。
张量tensors
张量是一种特殊的数据结构,和数组、矩阵非常相似。
在pytorch中,使用张量对模型的输入和输出以及模型的参数进行编码。
张量与numpy的ndarray是类似的。
首先需要导入库:
import torch
import numpy as np
初始化张量
通过数据创建张量
输入:
data=[[1,2],[3,4]]
x_data=torch.tensor(data)
print(x_data)
输出结果:
tensor([[1, 2],
[3, 4]])
通过numpy数组创建张量
我觉得,这个对我来说会比较常用
输入:
np_array=np.array(data)
x_np=torch.from_numpy(np_array)
print(x_np)
输出结果:
tensor([[1, 2],
[3, 4]], dtype=torch.int32)
通过另一个张量创建张量
输入:
x_ones = torch.ones_like(x_data)
# retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")
x_rand = torch.rand_like(x_data, dtype=torch.float)
# overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")
输出结果:
Ones Tensor:
tensor([[1, 1],
[1, 1]])
Random Tensor:
tensor([[0.7708, 0.7000],
[0.1971, 0.9383]])
使用随机数或常数值
输入:
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")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
可以看出,和numpy的api还挺像的。
shape
用来确定张量的维数。
输出:
Random Tensor:
tensor([[0.1455, 0.9689, 0.1498],
[0.0559, 0.1572, 0.5336]])
Ones Tensor:
tensor([[1., 1., 1.],
[1., 1., 1.]])
Zeros Tensor:
tensor([[0., 0., 0.],
[0., 0., 0.]])
张量的属性
张量属性描述了它们的形状、数据类型以及存储它们的设备。
输入:
tensor=torch.rand(3,4)
print(tensor)
print(tensor.shape)
print(tensor.dtype)
print(tensor.device)
输出:
tensor([[0.0196, 0.2932, 0.2158, 0.3143],
[0.6371, 0.8258, 0.9822, 0.4676],
[0.5914, 0.5520, 0.8491, 1.0000]])
torch.Size([3, 4])
torch.float32
cpu
张量运算
https://pytorch.org/docs/stable/torch.html描述了100多种张量运算,包括线性代数、矩阵操作(转置、索引、切片)等。这里只介绍最基础的,运算部分可以根据需要去官网直接查。
这些操作中的每一个都可以在GPU上运行,在数据量比较大,计算比较简单的情况下,速度通常可以高过CPU。
默认情况下,张量是在CPU上创建的。我们需要使用.to
方式显式地将张量移到GPU(在检查GPU可用性之后)。
可以通过这种方式把张量移到GPU。
if torch.cuda.is_available():
tensor=tensor.to("cuda")
类似numpy的索引和切片
输入:
tensor=torch.rand((4,4))
print(tensor)
print(tensor[0,2])
# first row
print(tensor[0])
# first column
print(tensor[:,0])
tensor[:,1]=0
print(tensor)
输出:
tensor([[0.0400, 0.3824, 0.3405, 0.3085],
[0.2176, 0.2908, 0.5853, 0.0284],
[0.1771, 0.7635, 0.9736, 0.1119],
[0.9058, 0.8726, 0.0410, 0.7673]])
tensor(0.3405)
tensor([0.0400, 0.3824, 0.3405, 0.3085])
tensor([0.0400, 0.2176, 0.1771, 0.9058])
tensor([[0.0400, 0.0000, 0.3405, 0.3085],
[0.2176, 0.0000, 0.5853, 0.0284],
[0.1771, 0.0000, 0.9736, 0.1119],
[0.9058, 0.0000, 0.0410, 0.7673]])
也可以用torch.cat
沿给定维度连接一系列张量。
输入:
tensor=torch.rand((3,2))
print(tensor)
t1=torch.cat([tensor,tensor,tensor],dim=0)
print(t1)
t1=torch.cat([tensor,tensor,tensor],dim=1)
print(t1)
输出:
tensor([[0.5197, 0.0784],
[0.1234, 0.7435],
[0.6404, 0.0392]])
tensor([[0.5197, 0.0784],
[0.1234, 0.7435],
[0.6404, 0.0392],
[0.5197, 0.0784],
[0.1234, 0.7435],
[0.6404, 0.0392],
[0.5197, 0.0784],
[0.1234, 0.7435],
[0.6404, 0.0392]])
tensor([[0.5197, 0.0784, 0.5197, 0.0784, 0.5197, 0.0784],
[0.1234, 0.7435, 0.1234, 0.7435, 0.1234, 0.7435],
[0.6404, 0.0392, 0.6404, 0.0392, 0.6404, 0.0392]])
连接numpy与tensor
numpy是每一个接触AI的人都会接触到的库,所以numpy与tensor的转换应该也很常用。
tensor到numpy数组
输入:
t=torch.ones(5)
print(t)
# 核心代码只有这一个:
n=t.numpy()
print(n)
输出:
tensor([1., 1., 1., 1., 1.])
[1. 1. 1. 1. 1.]
numpy数组到tensor
可以直接用torch.from_numpy
输入:
n=np.ones(5)
t=torch.from_numpy(n)
print(n)
n+=2
print(n)
print(t)
输出:
[1. 1. 1. 1. 1.]
[3. 3. 3. 3. 3.]
tensor([3., 3., 3., 3., 3.], dtype=torch.float64)
需要注意的是,即使已经把numpy转到tensor了,numpy数组有变化,tensor也会跟着变