Python3,3分钟,带你了解PyTorch,原来科学计算库也不是很难嘛。

1、引言

小屌丝:鱼哥, 最近忙啥嘞?
小鱼:啥也没干。
小屌丝:确定 没干??
小鱼:… 这话到你嘴里,咋就变为了。
小屌丝:也没有啊, 我就是确认下,你干没干。
在这里插入图片描述
小鱼:… 能干啥, 你想干啥 ?
小屌丝:我想请教你个问题。
小鱼:正儿八经的问题 ,是不?
小屌丝:你就看我今天这身穿的,还能不正经?
小鱼:穿新鞋走老路
小屌丝:此话咋讲?
小鱼:虚礼尽去
小屌丝:… 还整上词了。不管咋样,我还是要像你请教
小鱼:请教啥?
小屌丝:嘿嘿, 那鱼哥给我讲一讲 PyTorch呗
小鱼:麻雀讲家史、唐僧念紧箍咒、
小屌丝:这有咋讲?
小鱼:一言难尽。
小屌丝:那就慢慢讲, 又不着急
小鱼:…
在这里插入图片描述

2、PyTorch

2.1 PyTroch介绍

PyTorch简介

PyTorch是一个基于Python的科学计算库,它使用Tensor作为核心数据结构,并提供了强大的张量计算功能。PyTorch是由Facebook人工智能研究院(FAIR)开发并维护的,旨在为机器学习和深度学习研究者提供一个灵活、易于使用且高性能的工具。

2.2 PyTorch 核心特点

PyTorch的核心特点包括:

  • 动态计算图:PyTorch使用动态计算图进行张量计算,这使得代码更加直观且易于调试。
  • 可变形数组:PyTorch的张量支持可变形,这意味着它们可以在运行时改变形状和大小,这对于某些深度学习算法来说非常有用。
  • 自动微分:PyTorch提供了自动微分功能,可以自动计算张量的梯度,这在深度学习中非常有用。
  • GPU加速:PyTorch支持GPU加速,可以在处理大规模数据时提高计算性能。
  • 丰富的API和扩展:PyTorch提供了丰富的API和扩展,可以方便地构建各种类型的神经网络模型。

2.3 PyTorch实例

2.3.1 安装

因为PyTorch是三方库,所以,要使用的话,需要安装,老规矩, 先pip 方式安装:

pip install torch torchvision torchaudio

其余安装方式,可以参照这两篇:

2.3.2 实例

  • 示例1:对张量进行常规操作
# 创建一个张量  
x = torch.tensor([1, 2, 3])  
print(x)  

# 对张量进行操作  
y = x + 1  
print(y)
  • 示例2:定义神经网络模型
# -*- coding:utf-8 -*-
# @Time   : 2023-09-25
# @Author : Carl_DJ

'''
实现功能:
    定义神经网络模型
'''
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(3, 4)  
        self.fc2 = nn.Linear(4, 2)  
  
    def forward(self, x):  
        x = torch.relu(self.fc1(x))  
        x = self.fc2(x)  
        return x  
  • 示例3:模型训练

创建模型实例并定义损失函数和优化器

# -*- coding:utf-8 -*-
# @Time   : 2023-09-25
# @Author : Carl_DJ

'''
实现功能:
    训练模型
'''

for i in range(100):  
    # 前向传播  
    inputs = torch.randn(1, 3)  
    labels = torch.randn(1, 2)  
    outputs = model(inputs)  
    loss = criterion(outputs, labels)  
      
    # 反向传播和优化  
    optimizer.zero_grad()  
    loss.backward()  
    optimizer.step()  
      
    # 输出损失值  
    print('Epoch {}, Loss: {:.4f}'.format(i, loss.item()))

当然,PyTorch还有其他的功能,这里我再写一个示例,让你加深对PyTorch的了解。

  • 示例4:分类手写数字
# -*- coding:utf-8 -*-
# @Time   : 2023-09-25
# @Author : Carl_DJ

'''
实现功能:
    实现分类手写数字
'''

import torch  
import torch.nn as nn  
import torch.optim as optim  
from torchvision import datasets, transforms  
  
# 定义数据预处理方法  
transform = transforms.Compose([  
    transforms.ToTensor(), # 将图像转换为张量  
    transforms.Normalize((0.1307,), (0.3081,)) # 对张量进行标准化  
])  
  
# 加载 MNIST 数据集  
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)  
test_dataset = datasets.MNIST('./data', train=False, download=True, transform=transform)  
  
# 定义数据加载器  
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=True)  
  
# 定义神经网络结构  
class Net(nn.Module):  
    def __init__(self):  
        super(Net, self).__init__()  
        self.fc1 = nn.Linear(28 * 28, 512)  
        self.fc2 = nn.Linear(512, 256)  
        self.fc3 = nn.Linear(256, 10)  
  
    def forward(self, x):  
        x = x.view(-1, 28 * 28)  
        x = torch.relu(self.fc1(x))  
        x = torch.relu(self.fc2(x))  
        x = self.fc3(x)  
        return x  
  
# 实例化神经网络和损失函数  
model = Net()  
criterion = nn.CrossEntropyLoss()  
  
# 选择优化算法和学习率  
optimizer = optim.SGD(model.parameters(), lr=0.01)  
  
# 训练神经网络  
for epoch in range(10):  
    running_loss = 0.0  
    for i, data in enumerate(train_loader, 0):  
        inputs, labels = data  
        optimizer.zero_grad() # 清空梯度缓存  
        outputs = model(inputs) # 前向传播  
        loss = criterion(outputs, labels) # 计算损失函数  
        loss.backward() # 反向传播  
        optimizer.step() # 更新权重  
        running_loss += loss.item() # 累加损失函数值  
    print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(train_loader)))  
  
# 测试神经网络  
correct = 0  
total = 0  
with torch.no_grad(): # 关闭梯度计算  
    for data in test_loader:  
        images, labels = data  
        outputs = model(images)  
        _, predicted = torch.max(outputs.data, 1)  
        total += labels.size(0)  
        correct += (predicted == labels).sum().item()  
print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))

小屌丝:鱼哥,你给我解析一下,这段代码啊。
小鱼:这也需要解析? 我写的不够清楚啊?
小屌丝:不不不,已经够清楚了,只是我还想在继续了解一下
小鱼:看在你这么好学的份上,我就解析一下。

  • 解析
    • 首先、加载MNIST数据集并对数据进行预处理;
    • 其次、定义一个包含三个全连接层的神经网络,使用交叉熵损失函数来衡量网络的输出与标签之间的差距;
    • 第三、 使用随机梯度下降(SGD)算法训练神经网络;
    • 最后、测试网络的准确率。

小屌丝:奈斯。
在这里插入图片描述

3、总结

看到这里,今天的分享差不多就该结束了。
当然,按照惯例,我们在回顾一下今天的内容:

  • PyTorch的基本概念

  • PyTorch的特点

    • 动态计算图
    • 可变形数组
    • 自动微分
    • GPU加速
    • 丰富的API和扩展
  • PyTorch的代码示例

在最后,小鱼再唠叨一句,在当前人工智能遍布各个行业的今天, 作为一名新生代农民工,多多少少都需要了解人工智能的知识。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 51认证讲师等
  • 认证金牌面试官
  • 职场面试及培训规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,带你学习更多更专业更前言的人工智能相关技术。

猜你喜欢

转载自blog.csdn.net/wuyoudeyuer/article/details/132560371