AI创想

标题: PyTorch强化学习——PyTorch基础详解 [打印本页]

作者: tongjinqi    时间: 7 天前
标题: PyTorch强化学习——PyTorch基础详解
作者:CSDN博客
PyTorch 基础

我们将使用 PyTorch 作为实现强化学习算法的数值计算库。PyTorch 是 Facebook 开发的科学计算和机器学习库,张量 (Tensor) 是 PyTorch 中的核心数据结构,类似于 NumPy 中的 ndarray。 但是,PyTorch 在数组操作和遍历等方面的速度比 NumPy 更快,这主要是由于在 PyTorch 中,数组元素的访问速度更快。接下来,我们介绍一些 PyTorch 中的基本知识,以便在之后的强化学习实战中使用。
张量

创建张量

默认张量 (Tensor) 的数据类型是 torch.float32,这是张量运算最常用的数据类型。从区间 [0,1] 的均匀分布中随机采样生成浮点数:
  1. python
  2. 复制代码
  3. >>> import torch
  4. >>> x = torch.rand(4,3)
  5. >>> print(x)
  6. tensor([[0.1968, 0.6183, 0.9863],
  7.         [0.6465, 0.5472, 0.7393],
  8.         [0.4933, 0.1890, 0.0459],
  9.         [0.4462, 0.8802, 0.4948]])
复制代码
我们也可以创建指定数据类型的张量,例如,返回一个 double 类型的张量 (float64),如下所示:
  1. python
  2. 复制代码
  3. >>> x = torch.rand(4,3,dtype=torch.double)
  4. >>> print(x)
  5. tensor([[0.3899, 0.2509, 0.5130],
  6.         [0.5605, 0.5399, 0.2442],
  7.         [0.5419, 0.8523, 0.3360],
  8.         [0.4898, 0.1152, 0.4379]], dtype=torch.float64)
复制代码
创建指定尺寸的矩阵,并用 0 或 1 进行填充:
  1. python
  2. 复制代码
  3. >>> x = torch.zeros(4,3)
  4. >>> print(x)
  5. tensor([[0., 0., 0.],
  6.         [0., 0., 0.],
  7.         [0., 0., 0.],
  8.         [0., 0., 0.]])
  9. >>> x = torch.ones(4,3)
  10. >>> print(x)
  11. tensor([[1., 1., 1.],
  12.         [1., 1., 1.],
  13.         [1., 1., 1.],
  14.         [1., 1., 1.]])
复制代码
可以使用数据的 size 方法获得张量的尺寸,其返回 torch.Size 元组:
  1. python
  2. 复制代码
  3. >>> print(x.size())
  4. torch.Size([4, 3])
复制代码
可以使用 view 方法变换张量形状:
  1. python
  2. 复制代码
  3. >>> x_reshaped = x.view(2,6)
  4. >>> print(x_reshaped)
  5. tensor([[1., 1., 1., 1., 1., 1.],
  6.         [1., 1., 1., 1., 1., 1.]])
复制代码
可以直接使用数据创建张量,包括单个值,列表和嵌套列表:
  1. python
  2. 复制代码
  3. >>> x_1 = torch.tensor(4)
  4. >>> print(x_1)
  5. tensor(4)
  6. >>> x_2 = torch.tensor([11.11,22,33,0])
  7. >>> print(x_2)
  8. tensor([11.1100, 22.0000, 33.0000,  0.0000])
  9. >>> x_3 = torch.tensor([[1,2,3,4],[5,6.6,7.7,8.0]])
  10. >>> print(x_3)
  11. tensor([[1.0000, 2.0000, 3.0000, 4.0000],
  12.         [5.0000, 6.6000, 7.7000, 8.0000]])
复制代码
张量元素访问

可以使用类似于 NumPy 的方式利用索引来访问张量中的元素,对于单元素张量,我们也可以使用 item() 方法来访张量中的元素:
  1. python
  2. 复制代码
  3. >>> print(x_3[0])
  4. tensor([1., 2., 3., 4.])
  5. >>> print(x_3[0,0])
  6. tensor(1.)
  7. >>> print(x_3[:,2])
  8. tensor([3.0000, 7.7000])
  9. >>> print(x_3[:,2:])
  10. tensor([[3.0000, 4.0000],
  11.         [7.7000, 8.0000]])
  12. >>> print(x_1.item())
  13. 4
复制代码
张量数据类型转换

Tensor 和 NumPy 数组可以相互转换,使用 numpy() 方法可以将张量转换为 NumPy 数组,而想要将 NumPy 数组转换为张量想要使用 from_numpy() 方法:
  1. python
  2. 复制代码
  3. >>> print(x_3.numpy())
  4. [[1.  2.  3.  4. ]
  5. [5.  6.6 7.7 8. ]]
  6. >>> import numpy as np
  7. >>> x_np = np.ones(4)
  8. >>> x_torch = torch.from_numpy(x_np)
  9. >>> print(x_torch)
  10. tensor([1., 1., 1., 1.], dtype=torch.float64)
复制代码
需要注意的是,如果输入的 NumPy 数组是 float 数据类型,输出张量默认情况下为 double 类型,因此可能需要类型转换。在以下代码中,我们可以将 double 类型的张量转换为 float 类型:
  1. python
  2. 复制代码
  3. >>> print(x_torch.float())
  4. tensor([1., 1., 1., 1.])
复制代码
张量运算

PyTorch 中的运算操作也类似于 NumPy。接下来,我们以加法为例,可以直接使用 + 运算符,或者使用 add() 方法:
  1. python
  2. 复制代码
  3. >>> x_4 = torch.tensor([[1,1,1,0],[1,2,3,4.]])
  4. >>> print(x_3+x_4)
  5. tensor([[ 2.0000,  3.0000,  4.0000,  4.0000],
  6.         [ 6.0000,  8.6000, 10.7000, 12.0000]])
  7. >>> print(torch.add(x_3, x_4))
  8. tensor([[ 2.0000,  3.0000,  4.0000,  4.0000],
  9.         [ 6.0000,  8.6000, 10.7000, 12.0000]])
复制代码
同时,PyTorch 也支持就地 (in-place) 操作,这类操作可以直接改变张量对象:
  1. python
  2. 复制代码
  3. >>> x_3.add_(x_4)
  4. tensor([[ 2.0000,  3.0000,  4.0000,  4.0000],
  5.         [ 6.0000,  8.6000, 10.7000, 12.0000]])
  6. >>> print(x_3)
  7. tensor([[ 2.0000,  3.0000,  4.0000,  4.0000],
  8.         [ 6.0000,  8.6000, 10.7000, 12.0000]])
复制代码
在以上输出中,可以看到使用 add_() 方法,会直接修改 x_3 的值,将其改变为原始 x_3 与 x_4 之和。在 PyTorch 中,带有 _ 的方法都表明其为就地操作,它将使用结果值来更新张量。 默认情况下,PyTorch 张量存储在 CPU 上。PyTorch 张量可以使用 GPU 加速计算,这是张量与 NumPy 数组相比的主要优势。为了利用此优势,我们需要将张量移动到 CUDA 设备上。使用 cuda.is_available() 方法可以检测cuda的可用性,可以使用 to() 方法将张量移动到任何可用设备上:
  1. python
  2. 复制代码
  3. >>> torch.cuda.is_available()
  4. True
  5. >>> torch.cuda.device_count() # 统计可用的GPU数量
  6. 1
  7. >>> torch.cuda.current_device() # 当前GPU索引
  8. 0
  9. >>> torch.cuda.get_device_name(0) # GPU型号
  10. 'NVIDIA GeForce RTX 2070 SUPER'
  11. >>> x_3.device # 当前设备
  12. device(type='cpu')
  13. >>> device = 'cuda' if torch.cuda.is_available() else 'cpu'
  14. >>> x_3 = x_3.to(device) # 将张量转移到指定设备上
  15. >>> x_3.device
  16. device(type='cuda', index=0)
  17. >>> x_5 = torch.ones(3,3,device=device) # 创建张量时指定张量
  18. >>> print(x_5)
  19. tensor([[1., 1., 1.],
  20.         [1., 1., 1.],
  21.         [1., 1., 1.]], device='cuda:0')
复制代码
如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。





欢迎光临 AI创想 (https://llms-ai.com/) Powered by Discuz! X3.4