当前位置: 首页 > article >正文

深入探究PyTorch:理解PyTorch的基础知识(一)


❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈

PyTorch

(封面图由文心一格生成)

深入探究PyTorch:理解PyTorch的基础知识(一)

PyTorch是一个深度学习框架,它具有易于使用和灵活性等优点。它被广泛应用于各种深度学习任务,如计算机视觉、自然语言处理等。在本文中,我们将深入探究PyTorch的基础知识,包括PyTorch的张量、自动求导机制、模型构建和训练等。

1. PyTorch的张量

PyTorch的基本数据结构是张量(Tensor)。张量是一个多维数组,类似于NumPy中的数组。但是,PyTorch的张量与NumPy中的数组有一些重要区别。首先,PyTorch的张量支持GPU加速,这意味着它们可以在GPU上进行计算,从而提高了计算速度。其次,PyTorch的张量是自动求导机制的基础,这使得它们在深度学习中非常有用。

让我们从创建张量开始。我们可以使用torch.Tensor()函数创建一个张量:

import torch

x = torch.Tensor([1, 2, 3])
print(x)

输出:

tensor([1., 2., 3.])

上述代码中,我们创建了一个包含值[1,2,3]的一维张量。默认情况下,张量的数据类型是float32。我们可以使用dtype参数来指定数据类型:

x = torch.Tensor([1, 2, 3]).to(torch.int)
print(x)

输出:

tensor([1, 2, 3], dtype=torch.int32)

除了使用torch.Tensor()函数创建张量,我们还可以使用其他函数来创建不同类型的张量。例如,我们可以使用torch.zeros()函数创建一个全零张量:

x = torch.zeros((2, 3))
print(x)

输出:

tensor([[0., 0., 0.],
        [0., 0., 0.]])

我们也可以使用torch.ones()函数创建一个全1张量:

x = torch.ones((2, 3))
print(x)

输出:

tensor([[1., 1., 1.],
        [1., 1., 1.]])

PyTorch还提供了一些其他的函数来创建张量,例如torch.rand()用于创建随机张量,torch.arange()用于创建序列张量等。

2. 自动求导机制

PyTorch的自动求导机制是PyTorch的一个重要特性。这个特性使得我们能够轻松地计算梯度,这是训练深度学习模型所必需的。PyTorch中的自动求导机制是通过torch.autograd模块实现的。

让我们以一个简单的例子来说明PyTorch的自动求导机制。假设我们要计算函数 y = 2 x 2 + 3 x y = 2x^2 + 3x y=2x2+3x x = 2 x=2 x=2 处的导数。我们可以使用PyTorch来计算它:

import torch

x = torch.tensor(2.0, requires_grad=True)
y = 2*x**2 + 3*x
y.backward()

print(x.grad)

输出:

tensor(7.)

在上述代码中,我们首先创建一个张量 x x x,并将其设置为需要梯度计算。接下来,我们使用 x x x 计算出 y y y,然后调用 y.backward() 来计算梯度。最后,我们打印出 x.grad,这是在 x=2 处的导数。

在上述示例中,我们使用requires_grad=True来告诉PyTorch需要计算 x x x 的梯度。PyTorch将自动构建一个计算图来跟踪计算过程,并在反向传播时计算梯度。在训练深度学习模型时,我们通常会将模型参数设置为需要梯度计算,并使用自动求导机制来计算损失函数关于这些参数的梯度,以便进行优化。

3. 模型构建和训练

PyTorch提供了一个简单而强大的模型构建和训练框架。在PyTorch中,我们通常使用torch.nn模块来构建深度学习模型。该模块提供了许多常见的层类型,例如全连接层、卷积层、循环神经网络层等。我们还可以自定义层类型,以满足特定的需求。

在本节中,我们将构建一个简单的全连接神经网络,并使用PyTorch来训练它。我们将使用MNIST数据集,该数据集包含手写数字的图像和相应的标签。我们的目标是训练一个模型,将图像分类为0-9中的一个数字。

首先,我们需要下载并准备MNIST数据集。可以使用以下代码下载数据集:

import torch
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

上述代码中,我们使用torchvision.transforms模块定义了一个数据变换,该变换将图像转换为张量,并对其进行归一化。然后,我们使用torchvision.datasets模块下载并准备了训练和测试数据集。我们还使用torch.utils.data.DataLoader函数创建了数据加载器,以便在训练和测试过程中批量加载数据。

接下来我们将构建一个包含两个隐藏层的全连接神经网络,并使用交叉熵损失函数进行训练。我们将使用Adam优化器来优化模型的参数。

import torch.nn as nn
import torch.optim as optim

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(64, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)

在上述代码中,我们首先定义了一个Net类,该类继承自nn.Module。在类的构造函数中,我们定义了三个全连接层,并在forward函数中实现了网络的前向传播。我们还定义了交叉熵损失函数和Adam优化器。

接下来,我们可以使用以下代码进行训练:

for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

在上述代码中,我们使用两个嵌套的循环来遍历训练数据集中的所有批次。对于每个批次,我们首先将优化器的梯度清零,然后使用模型进行前向传播,并计算交叉熵损失函数的值。接下来,我们使用backward()函数来计算梯度,并使用优化器的step()函数来更新模型参数。最后,我们累加每个批次的损失值,并在每100个批次后打印平均损失值。

我们可以使用以下代码来测试模型在测试数据集上的性能:

correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy on the test images: %d %%' % (100 * correct / total))

在上述代码中,我们使用with torch.no_grad()来禁用梯度计算,以加速代码执行。我们使用模型进行前向传播,并计算正确分类的图像数量。最后,我们计算模型在测试数据集上的准确率。

4. 结论

在本文中,我们深入探究了PyTorch的基础知识,包括PyTorch的张量、自动求导机制和模型构建和训练等。PyTorch是一个灵活且易于使用的深度学习框架,可以用于各种深度学习任务。PyTorch的张量类似于NumPy中的数组,但具有GPU加速和自动求导机制等优点。PyTorch的自动求导机制是通过torch.autograd模块实现的,它允许我们轻松地计算梯度,这对训练深度学习模型非常有用。PyTorch的模型构建和训练框架使用torch.nn模块,该模块提供了许多常见的层类型,并支持自定义层类型。我们可以使用PyTorch轻松地构建和训练深度学习模型,以解决各种现实问题。


❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈


http://www.kler.cn/a/5246.html

相关文章:

  • 【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
  • 分布式环境下定时任务扫描时间段模板创建可预订时间段
  • 加速科技荣获“浙江省企业研究院”认定
  • Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本
  • 闲谭SpringBoot--ShardingSphere分库分表探究
  • Mysql 性能优化:索引条件下推(ICP)
  • 大数据学完好就业么
  • Typora 修改表格宽度
  • js时间前五分钟 + utc转本地时间
  • PUSCH接收端处理流程学习
  • 如何检测程序的合理性
  • 10个华为华为交换机常用的Python脚本,网络工程师收藏!
  • GPT-4零失误通关大厂模拟面试,offer拿到手软?与AGI首次接触
  • 学习HM微博项目第1天
  • C++特殊类设计
  • Go语言精修(尚硅谷笔记)第十六章
  • ChatGPT来了,让我们快速做个AI应用
  • 2023最新 淘宝短视频运营新思路!
  • 【学习笔记】计算机视觉与深度学习(4.卷积神经网络)
  • 数据结构——红黑树
  • 亚马逊流量密码-优化listing的跳出率
  • 2023年非业绩亏损ST股票投资策略研究报告
  • 《程序员面试金典(第6版)》面试题 08.04. 幂集(回溯算法,位运算,C++)不断更新
  • 王爽-汇编语言第二版学习-day1
  • 最强绘图AI:一文搞定Midjourney(附送咒语)
  • MybatisPlus简讲 -- 狂神说JAVA版