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

AI学习日记——PyTorch深度学习快速入门:从NumPy到张量的平滑过渡

目录

一、PyTorch是什么?

1.概念

2.核心优势对比

二、数组 VS 张量

1.从NumPy数组到PyTorch张量

2.自动求导

三、数据加载与预处理

1.Dataset

2.DataLoader

3.Transforms

总结


一、PyTorch是什么?

1.概念

       PyTorch 是一个开源的深度学习框架,基于 Python 编程语言,专为构建和训练神经网络模型而设计。你可以把它想象成一个专门适合深度学习研究的工具箱,让我们从繁琐的数学实现中解放出来,专注于算法设计。

2.核心优势对比

特性手写实现PyTorch框架
反向传播手动实现每个层的backward自动微分,一行代码完成
梯度计算手动推导数学公式自动构建计算图
参数更新手动实现优化算法内置多种优化器
GPU支持需要重写CUDA代码设备无关,自动切换
代码维护复杂,容易出错简洁,易于调试

二、数组 VS 张量

1.从NumPy数组到PyTorch张量

概念延续
        在之前的博客中我们处理的是4维数组(batch_num, channel, height, width),这在PyTorch中就是4维张量。

import numpy as np
import torch

# 数据格式对比
numpy_data = np.random.randn(10, 1, 28, 28)  
pytorch_data = torch.randn(10, 1, 28, 28)    

张量的核心特性

  • 设备无关性:同一代码可在CPU/GPU运行

  • 自动梯度跟踪:为神经网络训练奠定基础

  • 高效运算:针对深度学习优化的底层实现

常用函数(x,y=维度;a,b=数值):

        基础:torch.tensor(x,y)  /  torch.tensor([a,b]

        随机数:torch.randn(x,y)    

        全零:torch.zeros(x,y)

        全一:torch.ones(x,y)

2.自动求导

        PyTorch通过设置requires_grad=True会自动跟踪所有张量操作,构建动态计算图用于反向传播。调用backward()方法后,梯度会自动计算并存储在张量的grad属性中

# 创建需要梯度的张量
x = torch.tensor(2.0, requires_grad=True)
w = torch.tensor(3.0, requires_grad=True)
b = torch.tensor(1.0, requires_grad=True)

# 前向传播构建计算图
y = w * x + b      
loss = y ** 2         

# 自动计算所有梯度

optimizer.zero_grad()                        # 梯度清零!
loss.backward()

print(f"x的梯度: {x.grad}")                  # d(loss)/dx = 2*y*w = 2*7*3 = 42
print(f"w的梯度: {w.grad}")                # d(loss)/dw = 2*y*x = 2*7*2 = 28

optimizer.step()                                 # 更新参数

三、数据加载与预处理

1.Dataset:数据组织

作用:

  • 获取数据 & 标签
  • 获取总数据量
  • 按索引获取单个样本

代码实现:

from torch.utils.data import Dataset                 #获取原本Dataset类
from PIL import Image                                          #识别输入图像
import os                                                               #对路径操作

#继承并重写Dataset类
class MyData(Dataset): 
    def __init__(self, root_dir, label_dir):
        self.root_dir=root_dir             
        self.label_dir=label_dir   
        self.path=os.path.join(self.root_dir,self.label_dir)
        self.img_path=os.listdir(self.path)         #返回一个包含文件夹中所有文件名的一个list

    
    def __getitem__(self, idx):
        img_name=self.img_path[idx] 
        img_item_path=os.path.join(self.root_dir,self.label_dir,img_name) 
        img=Image.open(img_item_path) 
        label=self.label_dir 
        return img , label                                          #返回图片与标签(img是tensor数据类型

   
    def __len__(self):
        return len(self.img_path)

#使用示例

root_dir = '../dataset/train'
ants_label_dir = "ants_image"
bees_label_dir = "bees_image"
ants_dataset = MyData(root_dir,ants_label_dir)                 #实例化蚂蚁数据集
bees_dataset = MyData(root_dir,bees_label_dir)               #实例化蜜蜂数据集
train_dataset = ants_dataset+bees_dataset                       #将两个数据集合并为一个训练集
img,label=train_dataset[0]

img.show()
print(len(train_dataset))                                                      #输出数据集长度:245

主要函数:

  • init():把根目录('../dataset/train')和标签目录("ants_image")路径合并('../dataset/train/ants_image'),把合并路径下的所有文件名存储在一个列表中返回
  • getitem():按照文件索引(train_dataset[0]),找到文件名,与根目录标签目录路径合并('../dataset/train/ants_image/000'),获取对应的图片和标签
  • len():获取数据集长度

        注意,getitem()会同时获取图片格式的img和字符串格式的label,因此不能直接train_dataset[0].show()

    2.DataLoader:批量数据加载

    作用:

            把整理好的数据按一定方式加载到神经网络

    代码实现:

    from torch.utils.data import DataLoader             #获取原本DataLoader类

    #创建数据加载器

    dataset = MyData

    dataloader=DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,batch_sampler=None, num_workers=0, collate_fn=None,
    pin_memory=False, drop_last=False, timeout=0,worker_init_fn=None)

    # 使用示例
    for epoch in range(10):
        for batch_idx, (imgs, labels) in enumerate(dataloader):
            # imgs: [batch_size, channels, height, width]
            # labels: [batch_size]

            print(f"Epoch: {epoch}, Batch: {batch_idx}, Imgs shape: {imgs.shape}")

            #模型训练。。。

    主要参数:

    • dataset:数据&标签
    • batchsize:批次大小
    • shuffle:是否打乱顺序
    • numwokers:数据加载进程数量(=0表示主进程,>0表示多进程
    • drop_last:是否丢弃最后一个不完整批次

    3.Transforms:数据预处理

    作用:

            对数据进行预处理和增强操作。

    代码实现:

    from torchvision import transforms

    #创建预处理管道

    train_transform = transforms.Compose([
        transforms.Resize((32, 32)),                                  # 缩放
        transforms.RandomCrop(32, padding=4),             # 随机裁剪

        transforms.CenterCrop(224)                                  # 中心裁剪
        transforms.ToTensor(),                                           # 图片转张量
        transforms.Normalize( means=[ 0.1 , 0.3 , 0.2 ] , std=[ 1.1 , 1,2 , 1,3 ] )      # 标准化(分别对应三通道
    ])

    # 使用示例(省略在Mydata类里复写过程)

    train_dataset=Mydata(root_dir,ants_label_dir,transform=transform)


    总结

            PyTorch作为深度学习框架,具有灵活易用的特点,支持自动求导和GPU加速。文章介绍了PyTorch张量与NumPy数组的转换、自动梯度计算机制,以及数据加载预处理的关键组件:Dataset用于组织数据、DataLoader实现分批加载、Transforms进行数据增强。通过代码示例展示了如何构建自定义数据集、配置数据加载器和使用图像变换方法,为深度学习任务提供完整的数据处理流程。

    http://www.dtcms.com/a/503859.html

    相关文章:

  • 深圳做app网站公司岳阳建设网站的公司
  • 数组分块|裴蜀定理
  • 中交上航建设网站wordpress 插件发文章
  • Linux中进程创建和缓存对象初始化fork_init、proc_caches_init和buffer_init
  • 学校网站的作用和意义珠海仿站定制模板建站
  • 云原生网络基础:IP、端口与网关实战
  • 郑州网站优化平台做网站需要营业执照吗
  • 企业app商城开发网站建设wordpress userpro
  • C++与C#使用GDI+创建PNG并旋转文本的对比实现
  • 动图在线制作网站烟台广告公司网站建设
  • react.js做的网站学室内装修设计
  • 如何处理大数处理技巧(vpa函数
  • 设计模式举例
  • 【Spring Security】安全过滤链
  • 小区媒体网站建设wordpress简易主题
  • 手机网站经典案例wordpress负载均衡上传附件
  • 银川网站建站中企动力做的网站价格区间
  • 兴义网站开发杭州赛虎网站建设
  • 数据库基础概念体系梳理
  • Kotlin Flow 的使用
  • 网站如何做seo上海网站推广方法
  • Qwen2.5技术报告解读:Qwen2.5 Technical Report
  • 操作系统:进程同步问题(一)
  • Linux---终端 I/O 控制接口开发<termios.h>终端输入输出系统
  • Linux 之 【Linux权限】
  • 网站建设策划书范文案例重庆百度关键词推广
  • 健身器材 网站模版wordpress用户系统
  • 两款实用工具分享:下载与网速测试的轻量级解决方案
  • DVWA靶场实战:Web四大经典漏洞攻防全解析
  • 海外网站测速本地网站建设开发信息大全