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 = 28optimizer.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进行数据增强。通过代码示例展示了如何构建自定义数据集、配置数据加载器和使用图像变换方法,为深度学习任务提供完整的数据处理流程。