pytorch入门笔记1

本文是一篇pytorch入门笔记,主要讲了Pytorch环境配置和基本数据类型。

pytorch的安装

更新cuda驱动

N卡驱动程序官网下载驱动更新程序

可选择自动下载或者手动下载

image-20230711105656694

以自动更新程序为例,在驱动程序页面完成更新即可

image-20230711105745926

更新完成后,查看N卡设置

image-20230711105810959

image-20230711105844840

发现CUDA版本已经更新到12.2.19

下载pytorch

在安装了conda的情况下,在命令行输入(windows下powershell需要开管理员权限)

1
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

在ipython中验证pytorch是否正确安装

1
2
3
4
5
6
7
8
9
10
11
Python 3.10.9 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:15) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> x = torch.rand(5,3)
>>> print(x)
tensor([[0.4660, 0.0961, 0.7834],
[0.3614, 0.2262, 0.8813],
[0.9523, 0.8653, 0.2905],
[0.4628, 0.0707, 0.6660],
[0.4278, 0.7403, 0.2035]])
>>>

为conda环境配置pytorch

1
2
conda create -n MyEnv pytorch
conda activate MyEnv

image-20230711152214412

使用jupyter notebook进行验证。

pytorch的基本使用

详情请见pytorch官方文档

张量(Tensors)

pytorch一大作用是替换numpy,使用张量(tensors)替代numpy的多维数组(ndarrays),前者的优势是可以部署到GPU上来加速向量运算。

必须使用的库是torch

1
import torch

定义张量

用法和numpy.rand,empty,zeros类似

1
2
3
4
torch.rand() 
torch.empty() # torch.new_empty()
torch.zeros() # torch.new_zeros()
torch.ones() # torch.new_ones()

可以将python list,numpy ndarray转为tensor

1
2
torch.tensor([[1., -1.], [1., -1.]])
torch.tensor(np.array([[1, 2, 3], [4, 5, 6]]))

利用原有张量形状创建张量

1
torch.randn_like(old_tensor,dtype=...)

张量运算

1
2
3
4
5
import torch
A = torch.tensor([[1,2],[3,4]])
B = torch.tensor([[3,5],[9,11]])
print(A,B)

​ tensor([[1, 2],
​ [3, 4]]) tensor([[ 3, 5],
​ [ 9, 11]])

张量运算

加法
1
2
3
4
5
6
7
8
9
10
11
12
# 加法
print('user operator + ')
print(A+B)
print('user add(tensor1,tensor2,[out = tensor3])')
C = torch.empty_like(A)
print(torch.add(A,B,out = C))
print('output C')
print(C)
print('A.add(B)')
print(A.add(B))
print('oprand after add')
print(A,B)

​ user operator +
​ tensor([[ 4, 7],
​ [12, 15]])
​ user add(tensor1,tensor2,[out = tensor3])
​ tensor([[ 4, 7],
​ [12, 15]])
​ output C
​ tensor([[ 4, 7],
​ [12, 15]])
​ A.add(B)
​ tensor([[ 4, 7],
​ [12, 15]])
​ oprand after add
​ tensor([[1, 2],
​ [3, 4]]) tensor([[ 3, 5],
​ [ 9, 11]])

cuda张量

tensor可以通过.to方法部署到不同的计算设备上

1
2
3
4
5
6
7
if torch.cuda.is_available():
device = torch.device("cuda") # 定义一个 CUDA 设备对象
y = torch.ones_like(A, device=device) # 显示创建在 GPU 上的一个 tensor
x = y.to(device) # 也可以采用 .to("cuda")
z = x + y
print(z)
print(z.to("cpu", torch.double)) # .to() 方法也可以改变数值类型

梯度(grad)

梯度的概念是机器学习中的重中之重。

在pytorch中,pytorch中的autograd库提供了对tensor所有运算自动跟踪计算梯度的功能。

1
2
3
4
5
6
7
import torch
A = torch.rand(3,3,requires_grad=True)
print(A)
B = A + 2
print(B)
C= B*B*3
print(C)

运行结果:

image-20230711162307175

使用backward方法使用反向传播计算A张量的梯度

1
2
3
4
out = C.mean()
print(out)
out.backward()
print(A.grad)

image-20230711162845636