首页 > 编程语言 >Python与深度学习库PyTorch进阶

Python与深度学习库PyTorch进阶

时间:2024-10-13 11:23:02浏览次数:7  
标签:进阶 nn Python self torch 张量 PyTorch print

在这里插入图片描述

Python与深度学习库PyTorch进阶

从零开始:PyTorch环境搭建与第一个神经网络

在进入深度学习的奇妙世界之前,首先需要准备好你的工具箱。想象一下,你是一位即将踏上旅程的探险家,而你的装备就是PyTorch——一个强大且灵活的深度学习框架。要开启这段冒险,你需要安装好PyTorch,并设置好开发环境。

安装PyTorch

安装PyTorch非常简单。你可以通过pip来安装最新版本的PyTorch。如果你使用的是GPU加速版本,可以这样安装:

pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113

如果你没有GPU,可以选择CPU版本:

pip install torch torchvision torchaudio

第一个神经网络

现在,让我们创建你的第一个神经网络。我们将从一个简单的全连接网络(也称为多层感知机)开始。这个网络将用于分类任务,比如识别手写数字。

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.5,), (0.5,))
])

# 加载MNIST数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)

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

# 定义模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)  # 输入层到隐藏层
        self.relu = nn.ReLU()  # 激活函数
        self.fc2 = nn.Linear(128, 10)  # 隐藏层到输出层

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 展平图像
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleNN()

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练模型
num_epochs = 5
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if (i+1) % 100 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print(f'Accuracy of the model on the 10000 test images: {100 * correct / total:.2f}%')

在这个例子中,我们首先加载了MNIST数据集,并进行了标准化处理。接着定义了一个简单的两层全连接网络。训练过程中,我们使用了交叉熵损失函数和随机梯度下降优化器。最后,我们在测试集上评估了模型的准确率。

玩转张量:掌握PyTorch核心——Tensor操作全解析

如果说神经网络是深度学习的心脏,那么张量(Tensor)就是它的血液。理解如何操作张量对于构建高效的深度学习模型至关重要。我们可以把张量看作是多维数组,它不仅支持数值计算,还支持自动求导等高级功能。

创建张量

在PyTorch中,创建张量非常直观。以下是一些常见的创建方式:

import torch

# 创建一个全零张量
x = torch.zeros(3, 4)
print(x)

# 创建一个全一张量
y = torch.ones(2, 3)
print(y)

# 从列表创建张量
z = torch.tensor([[1, 2], [3, 4]])
print(z)

# 创建一个随机张量
random_tensor = torch.rand(2, 2)
print(random_tensor)

张量运算

张量之间的运算也非常简单。你可以进行加法、乘法等基本运算,还可以使用更复杂的数学函数。

# 张量加法
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
c = a + b
print(c)

# 张量乘法
d = a * b
print(d)

# 矩阵乘法
e = torch.mm(a, b.T)  # 注意这里使用了转置
print(e)

# 使用更复杂的数学函数
f = torch.sin(a)
print(f)

自动求导

PyTorch的一个强大特性是自动求导。这使得你可以轻松地对张量进行梯度计算,这对于训练神经网络非常重要。

# 设置张量为可求导
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)

# 定义一个简单的函数
y = x.sum()
print(y)

# 反向传播计算梯度
y.backward()

# 查看梯度
print(x.grad)

通过这些例子,你可以看到PyTorch中的张量操作是多么的直观和强大。熟练掌握这些操作将帮助你在构建复杂模型时更加得心应手。

模型构建的艺术:自定义神经网络层与模块

当你熟悉了基本的张量操作后,下一步就是构建更加复杂的神经网络。这就像是建筑师设计一座摩天大楼,每个楼层都有其特定的功能。在PyTorch中,你可以通过继承nn.Module类来定义自己的层和模块。

自定义层

假设我们要实现一个简单的卷积层。虽然PyTorch已经提供了现成的nn.Conv2d,但我们可以自己动手实现,以更好地理解其内部机制。

import torch
import torch.nn as nn

class CustomConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
        super(CustomConv2d, self).__init__()
        self.in_channels = in_channels
        self.out_channels = out_channels
        self.kernel_size = kernel_size
        self.stride = stride
        self.padding = padding
        
        # 初始化权重和偏置
        self.weight = nn.Parameter(torch.randn(out_channels, in_channels, kernel_size, kernel_size))
        self.bias = nn.Parameter(torch.randn(out_channels))

    def forward(self, x):
        # 手动实现卷积操作
        return torch.nn.functional.conv2d(x, self.weight, self.bias, self.stride, self.padding)

# 测试自定义卷积层
conv_layer = CustomConv2d(1, 16, 3, 1, 1)
input_data = torch.randn(1, 1, 28, 28)
output = conv_layer(input_data)
print(output.shape)

在这个例子中,我们定义了一个自定义的卷积层CustomConv2d,并手动实现了前向传播过程。虽然这比直接使用nn.Conv2d复杂一些,但它有助于你深入理解卷积操作的细节。

自定义模块

除了单个层,你还可以定义整个模块。例如,我们可以创建一个包含卷积层、激活函数和池化层的小模块。

class ConvBlock(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
        super(ConvBlock, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.conv(x)
        x = self.relu(x)
        x = self.pool(x)
        return x

# 测试自定义模块
conv_block = ConvBlock(1, 16, 3, 1, 1)
input_data = torch.randn(1, 1, 28, 28)
output = conv_block(input_data)
print(output.shape)

通过这种方式,你可以将多个层组合成一个模块,从而简化代码结构,提高代码的可读性和复用性。

训练秘籍:优化器、损失函数与训练循环的完美结合

有了精心设计的模型,接下来就是训练它了。训练一个深度学习模型就像是调教一只聪明的宠物狗,需要耐心、技巧和正确的工具。PyTorch提供了多种优化器和损失函数,可以帮助你高效地训练模型。

选择合适的优化器

PyTorch内置了许多常用的优化器,如SGD、Adam和RMSprop。不同的优化器适用于不同的场景。例如,SGD简单且易于理解,但可能收敛较慢;而Adam则结合了动量和自适应学习率,通常能更快地收敛。

import torch.optim as optim

# 定义模型
model = SimpleNN()

# 选择优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

选择合适的损失函数

损失函数是衡量模型预测结果与真实值之间差异的重要工具。根据任务的不同,可以选择不同的损失函数。例如,分类任务常用交叉熵损失函数,回归任务常用均方误差损失函数。

# 选择损失函数
criterion = nn.CrossEntropyLoss()

训练循环

训练循环是模型训练的核心部分。它包括前向传播、计算损失、反向传播和参数更新。下面是一个完整的训练循环示例:

# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if (i+1) % 100 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

在这个训练循环中,我们首先进行前向传播得到模型的输出,然后计算损失。接着,我们清空优化器的梯度缓存,执行反向传播计算梯度,并更新模型参数。每100步打印一次当前的损失值,以便观察训练过程。

学习率调度

为了进一步提高训练效果,可以使用学习率调度器动态调整学习率。例如,StepLR可以在指定的步骤降低学习率。

# 定义学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)

# 在每个epoch结束后更新学习率
for epoch in range(num_epochs):
    # 训练代码...
    
    scheduler.step()

通过合理选择优化器、损失函数,并设计良好的训练循环,你可以有效地训练出高性能的深度学习模型。

实战演练:用PyTorch解决图像分类挑战

理论知识固然重要,但实践才是检验真理的唯一标准。现在,让我们通过一个实际的图像分类任务来巩固所学的知识。我们将使用CIFAR-10数据集,这是一个包含10类不同物体的图像数据集,非常适合用来练习图像分类。

数据准备

首先,我们需要加载CIFAR-10数据集,并进行必要的预处理。

import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10

# 数据预处理
transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomCrop(32, padding=4),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 加载CIFAR-10数据集
train_dataset = CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = CIFAR10(root='./data', train=False, download=True, transform=transform)

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

构建模型

接下来,我们构建一个稍微复杂一点的卷积神经网络(CNN),用于图像分类。

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(64 * 8 * 8, 512)
        self.fc2 = nn.Linear(512, 10)
        self.dropout = nn.Dropout(p=0.5)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 64 * 8 * 8)
        x = F.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x

model = CNN()

训练模型

现在,我们可以使用前面介绍的训练循环来训练我们的模型。

# 选择优化器和损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

# 训练模型
num_epochs = 20
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)
        
        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if (i+1) % 100 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

评估模型

训练完成后,我们还需要在测试集上评估模型的性能。

# 测试模型
with torch.no_grad():
    correct = 0
    total = 0
    for images, labels in test_loader:
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print(f'Accuracy of the model on the 10000 test images: {100 * correct / total:.2f}%')

通过这个实战项目,你不仅可以加深对PyTorch的理解,还能积累宝贵的实践经验。希望你能在这个过程中发现深度学习的乐趣,并不断探索更多有趣的应用!


嘿!欢迎光临我的小小博客天地——这里就是咱们畅聊的大本营!能在这儿遇见你真是太棒了!我希望你能感受到这里轻松愉快的氛围,就像老朋友围炉夜话一样温馨。


这里不仅有好玩的内容和知识等着你,还特别欢迎你畅所欲言,分享你的想法和见解。你可以把这里当作自己的家,无论是工作之余的小憩,还是寻找灵感的驿站,我都希望你能在这里找到属于你的那份快乐和满足。
让我们一起探索新奇的事物,分享生活的点滴,让这个小角落成为我们共同的精神家园。快来一起加入这场精彩的对话吧!无论你是新手上路还是资深玩家,这里都有你的位置。记得在评论区留下你的足迹,让我们彼此之间的交流更加丰富多元。期待与你共同创造更多美好的回忆!


欢迎来鞭笞我:master_chenchen


【内容介绍】

  • 【算法提升】:算法思维提升,大厂内卷,人生无常,大厂包小厂,呜呜呜。卷到最后大家都是地中海。
  • 【sql数据库】:当你在海量数据中迷失方向时,SQL就像是一位超级英雄,瞬间就能帮你定位到宝藏的位置。快来和这位神通广大的小伙伴交个朋友吧!
    【微信小程序知识点】:小程序已经渗透我们生活的方方面面,学习了解微信小程序开发是非常有必要的,这里将介绍微信小程序的各种知识点与踩坑记录。- 【python知识】:它简单易学,却又功能强大,就像魔术师手中的魔杖,一挥就能变出各种神奇的东西。Python,不仅是代码的艺术,更是程序员的快乐源泉!
    【AI技术探讨】:学习AI、了解AI、然后被AI替代、最后被AI使唤(手动狗头)

好啦,小伙伴们,今天的探索之旅就到这里啦!感谢你们一路相伴,一同走过这段充满挑战和乐趣的技术旅程。如果你有什么想法或建议,记得在评论区留言哦!要知道,每一次交流都是一次心灵的碰撞,也许你的一个小小火花就能点燃我下一个大大的创意呢!
最后,别忘了给这篇文章点个赞,分享给你的朋友们,让更多的人加入到我们的技术大家庭中来。咱们下次再见时,希望能有更多的故事和经验与大家分享。记住,无论何时何地,只要心中有热爱,脚下就有力量!


对了,各位看官,小生才情有限,笔墨之间难免会有不尽如人意之处,还望多多包涵,不吝赐教。咱们在这个小小的网络世界里相遇,真是缘分一场!我真心希望能和大家一起探索、学习和成长。虽然这里的文字可能不够渊博,但也希望能给各位带来些许帮助。如果发现什么问题或者有啥建议,请务必告诉我,让我有机会做得更好!感激不尽,咱们一起加油哦!


那么,今天的分享就到这里了,希望你们喜欢。接下来的日子里,记得给自己一个大大的拥抱,因为你真的很棒!咱们下次见,愿你每天都有好心情,技术之路越走越宽广!
在这里插入图片描述

标签:进阶,nn,Python,self,torch,张量,PyTorch,print
From: https://blog.csdn.net/master_chenchen/article/details/142851002

相关文章

  • python量化数据6:计算宁德时代macd金叉死叉红柱绿柱大小
    一、通达信公式#行业业绩轮动公众号首发DIFF:=EMA(CLOSE,12)-EMA(CLOSE,26);DEA:=EMA(DIFF,9);MACD:=2*(DIFF-DEA);金叉cross(diff,dea)死叉cross(dea,diff)二、代码#行业业绩轮动公众号首发#tdx_indicator是1个通达信常用函数的封装库,下载可以从我的开......
  • 三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
    本文深入探讨Transformer模型中三种关键的注意力机制:自注意力、交叉注意力和因果自注意力。这些机制是GPT-4、Llama等大型语言模型(LLMs)的核心组件。通过理解这些注意力机制,我们可以更好地把握这些模型的工作原理和应用潜力。我们不仅会讨论理论概念,还将使用Python和PyTorch从零开......
  • Python实践——实现视频.mp4转图片.jpg(可成功实现)
    代码......
  • Python从0到100(六十三):Python OpenCV-入门基础知识
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • 【云原生技术】Docker容器进阶知识
    文章目录namespace概述一、namespace的基本概念二、namespace的主要作用三、namespace的类型四、namespace的操作五、namespace在容器技术中的应用cgroup一、cgroup的基本概念二、cgroup的主要功能三、cgroup的子系统介绍四、cgroup的应用场景五、cgroup的使用与管理cg......
  • Springboot在线学习辅导管理系统--49101(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对在线学习辅导管理系统等问题,对在线学习辅导管理系统进行研究分析,然后开发设计出在线学习辅......
  • Springboot一个小说阅读APP的设计与实现--48151(免费领源码)可做计算机毕业设计JAVA、PH
    摘 要大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在小说在线阅读的需求下,开发一款小说阅读APP,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保障,能保......
  • 基于SaaS的小区物业管理系统设计与实现--47357(免费领源码)可做计算机毕业设计JAVA、PHP
    摘 要本论文主要论述了如何使用SpringBoot开发一个基于SaaS的小区物业管理系统小程序,本系统将严格按照软件开发流程进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述小区物业管理系统小程序的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程......
  • 利用Vue3的axios+Python的flask实现前后端交互功能
    1功能实现1.1功能在网页中输入两个数字后,点击计算按钮在线计算(注意不是在浏览器端)获得两数之和。1.2思路前端使用vue3的axios向服务器发送post请求,利用flask框架使python服务器返回计算后的数值,赋给前端的变量,最终在浏览器上显示。2前端部分:2.1html<div><inputv-mod......
  • Pytorch小土堆跟练代码(第1天)
    本系列为跟练小土堆每集代码,然后进入李宏毅机器学习教程。在系列中会敲完所有视频中代码,并且在注释写出感悟和易错点。欢迎大家一起交流!最前面的安装部分,可以移步我的另一个帖子第一章·Dataset首先讲了数据集的读取,主要调用了Dataset相关的函数,有图片和特征的地址提取和打......