深度学习是机器学习的一个分支,其中编写了模仿人脑功能的算法。深度学习中最常用的库是 Tensorflow 和 PyTorch。由于有各种可用的深度学习框架,人们可能想知道何时使用 PyTorch。以下是人们可能更喜欢将 Pytorch 用于特定任务的原因。 Pytorch 是一个开源深度学习框架,带有 Python 和 C++ 接口。Pytorch 位于 torch 模块中。在 PyTorch 中,必须处理的数据以张量的形式输入。 安装 PyTorch如果您的系统中安装了 Anaconda Python 包管理器,那么通过在终端中运行以下命令来安装 PyTorch: conda install pytorch torchvision cpuonly -c pytorch 如果您想使用 PyTorch 而不将其显式安装到本地计算机中,则可以使用 Google Colab。 PyTorch 张量Pytorch 用于处理张量。张量是多维数组,例如 n 维 NumPy 数组。但是,张量也可以在 GPU 中使用,但在 NumPy 数组的情况下则不然。PyTorch 加速了张量的科学计算,因为它具有各种内置功能。 向量是一维张量,矩阵是二维张量。在 C、C++ 和 Java 中使用的张量和多维数组之间的一个显着区别是张量在所有维度上应该具有相同的列大小。此外,张量只能包含数字数据类型。 张量的两个基本属性是: 形状:指数组或矩阵的维数 代码: # 导入 torchimport torch# 创建张量t1=torch.tensor([1, 2, 3, 4])t2=torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 打印张量:print("Tensor t1: \n", t1)print("\nTensor t2: \n", t2)# 张量的秩print("\nRank of t1: ", len(t1.shape))print("Rank of t2: ", len(t2.shape))# 张量的形状print("\nRank of t1: ", t1.shape)print("Rank of t2: ", t2.shape) 输出: 在 PyTorch 中创建张量在 PyTorch 中有多种创建张量的方法。张量可以包含单一数据类型的元素。我们可以使用 python 列表或 NumPy 数组创建张量。Torch 有 10 种用于 GPU 和 CPU 的张量变体。以下是定义张量的不同方法。
代码: # 导入 torch 模块import torchimport numpy as np# 存储为张量的值列表data1 = [1, 2, 3, 4, 5, 6]data2 = np.array([1.5, 3.4, 6.8,9.3, 7.0, 2.8])# 创建张量和打印t1 = torch.tensor(data1)t2 = torch.Tensor(data1)t3 = torch.as_tensor(data2)t4 = torch.from_numpy(data2)print("Tensor: ",t1, "Data type: ", t1.dtype,"\n")print("Tensor: ",t2, "Data type: ", t2.dtype,"\n")print("Tensor: ",t3, "Data type: ", t3.dtype,"\n")print("Tensor: ",t4, "Data type: ", t4.dtype,"\n") 输出: 在 Pytorch 中重构张量我们可以在 PyTorch 中根据需要修改张量的形状和大小。我们还可以创建一个 nd 张量的转置。以下是根据需要更改张量结构的三种常用方法: .reshape(a, b) :返回一个大小为 a,b 的新张量
代码: # 导入 torch 模块import torch# 定义张量t = torch.tensor([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]])# 重塑张量print("Reshaping")print(t.reshape(6, 2))# 调整张量的大小print("\nResizing")print(t.resize(2, 6))# 转置张量print("\nTransposing")print(t.transpose(1, 0)) PyTorch 中张量的数学运算我们可以使用 Pytorch 对张量执行各种数学运算。执行数学运算的代码与 NumPy 数组的代码相同。下面是在张量中执行四种基本操作的代码。 # 导入 torch 模块import torch# 定义两个张量t1 = torch.tensor([1, 2, 3, 4])t2 = torch.tensor([5, 6, 7, 8])# 添加两个张量print("tensor2 + tensor1")print(torch.add(t2, t1))# 减去两个张量print("\ntensor2 - tensor1")print(torch.sub(t2, t1))# 将两个张量相乘print("\ntensor2 * tensor1")print(torch.mul(t2, t1))# 将两个张量相除print("\ntensor2 / tensor1")print(torch.div(t2, t1)) 输出: Pytorch 模块PyTorch 库模块对于创建和训练神经网络至关重要。三个主要的库模块是 Autograd、Optim 和 nn。
为了训练任何神经网络,我们执行反向传播来计算梯度。通过调用 .backward() 函数,我们可以计算从根到叶的每个梯度。 代码: # 导入 torchimport torch# 创建张量t1=torch.tensor(1.0, requires_grad = True)t2=torch.tensor(2.0, requires_grad = True)# 创建变量和渐变z=100 * t1 * t2 z.backward()# 打印渐变print("dz/dt1 : ", t1.grad.data)print("dz/dt2 : ", t2.grad.data) 输出:
为了创建一个单层模型,我们可以简单地使用 nn.Sequential() 来定义它。
对于不在单个序列中的模型的实现,我们通过继承 nn.Module 类来定义模型。 class Model (nn.Module) :def __init__(self):super(Model, self).__init__() self.linear = torch.nn.Linear(1, 1)def forward(self, x): y_pred = self.linear(x)return y_pred PyTorch 数据集和数据加载器torch.utils.data.Dataset 类包含所有自定义数据集。我们需要实现两个方法, PyTorch 数据加载器具有一个惊人的特性,即与自动批处理并行加载数据集。因此,它减少了顺序加载数据集的时间,从而提高了速度。
PyTorch DataLoader 支持两种类型的数据集: 地图样式数据集:数据项映射到索引。在这些数据集中, 使用 PyTorch 构建神经网络我们将在逐步实现中看到这一点: 1.数据集准备:由于 PyTorch 中的一切都以张量的形式表示,所以我们应该首先使用张量。 现在让我们从头开始构建一个神经网络: # 导入 torchimport torch# 训练 input(X) 和 output(y)X = torch.Tensor([[1], [2], [3],[4], [5], [6]])y = torch.Tensor([[5], [10], [15],[20], [25], [30]])class Model(torch.nn.Module):# defining layerdef __init__(self):super(Model, self).__init__() self.linear = torch.nn.Linear(1, 1)# 实施前向传递def forward(self, x): y_pred = self.linear(x)return y_pred model = torch.nn.Linear(1 , 1)# 定义损失函数和优化器loss_fn = torch.nn.L1Loss()optimizer = torch.optim.Adam(model.parameters(), lr = 0.01 )for epoch in range(1000):# 使用初始权重预测 y y_pred = model(X.requires_grad_())# 损失计算 loss = loss_fn(y_pred, y)# 计算梯度 loss.backward()# 更新权重 optimizer.step() optimizer.zero_grad()# 测试新数据X = torch.Tensor([[7], [8]])predicted = model(X)print(predicted) 输出: 🎁 |
|