深度学习-PyTorch基础

未来我们要学习的:

基础模型:

机器学习对于结构化数据和非结构化数据的应用:

  • 结构化数据意味着数据的基本数据库。例如在房价预测中,你可能有一个数据库,有专门的几列数据告诉你卧室的大小和数量,这就是结构化数据。或预测用户是否会点击广告,你可能会得到关于用户的信息,比如年龄以及关于广告的一些信息,然后对你的预测分类标注,这就是结构化数据,意思是每个特征,比如说房屋大小卧室数量,或者是一个用户的年龄,都有一个很好的定义。

  • 相反非结构化数据是指比如音频,原始音频或者你想要识别的图像或文本中的内容。这里的特征可能是图像中的像素值或文本中的单个单词。

1. PyTorch加载数据集

使用 torch.utils.data 中的 dataset 和 dataloader:

1. Dataset 是什么?

一个类,代表你所有的数据。它告诉 PyTorch:

  • 数据的长度是多少

  • 每次你访问一个索引(比如第 3 条数据)时,返回什么?

自主实现时,必须实现:

class MyDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        x = self.data[idx]
        y = self.labels[idx]

2. DataLoader 是什么?

一个工具,用来高效地加载 Dataset 中的数据,支持:

  • 按 batch 加载

  • 是否打乱顺序(shuffle

  • 多线程预加载(num_workers)

  • 自动打包

  • Tensor

from torch.utils.data import DataLoader
dataset = MyDataset(data, labels)
loader = DataLoader(dataset, batch_size=32, shuffle=True)

for batch in loader:
    x_batch, y_batch = batch
    # 用这批数据进行训练

dataset默认自动调用的是getitem 方法:

len 的用途:

  当你写 len(a) 时,Python 会自动调用 a.__len__()

  它返回的是数据集的大小(即样本数量),不是访问某个样本。

getitem 的用途:

  当你写 a[0] 时,Python 会自动调用 a.__getitem__(0)

  它返回的是索引为 0 的样本和标签,不是整个数据集的长度。

所以:

  •   a[0] → 调用的是 getitem(0) → 返回 (data[0], labels[0])
  •   len(a) → 调用的是 len() → 返回 len(data)

os.listdir 是 Python 中用于获取指定目录下所有文件和子目录名称的函数。 它返回一个列表,包含了目录中的所有条目,不包括 ...

import os, sys

# 打开文件
path = "/var/www/html/"
dirs = os.listdir( path )

# 输出所有文件和文件夹
for file in dirs:
    print (file)

输出:
test.htm
stamp
faq.htm
_vti_txt
robots.txt
itemlisting
resumelisting
writing_effective_resume.htm
advertisebusiness.htm
papers
resume

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退。

迭代器有两个基本的方法:iter()next()

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2

2. PyTorch TensorBoard

核心功能:可视化训练过程、模型结构、数据分布等,提升调试效率。

基础使用流程:访问 http://localhost:6006 (默认端口)

from torch.utils.tensorboard import SummaryWriter

# 创建Writer(日志保存目录)
writer = SummaryWriter("runs/exp1")  # 路径自动创建

# 记录标量(损失/准确率)
for epoch in range(100):
    loss = ...  # 计算损失
    accuracy = ...  # 计算准确率
    writer.add_scalar("Loss/train", loss, epoch)
    writer.add_scalar("Accuracy/train", accuracy, epoch)

# 记录直方图(权重分布)
writer.add_histogram("fc1_weight", model.fc1.weight, epoch)

# 关闭Writer
writer.close()

1. 标量可视化(训练指标)

writer.add_scalar("Loss/val", val_loss, global_step=epoch)  # 主标签/子标签
writer.add_scalars("Loss", {"train": train_loss, "val": val_loss}, epoch)

  add_scalar()

  • 作用:记录标量数据随时间的变化

  • 常用场景:训练损失、验证准确率、学习率等指标跟踪

writer.add_scalar("Loss/train", train_loss, epoch)  # 主标签/子标签
writer.add_scalar("Accuracy/val", val_acc, epoch)

2. 图像可视化

记录单个图像(CHW格式)
writer.add_image("input_sample", img_tensor, epoch)
记录网格(如数据增强效果)
images = torch.stack([img1, img2], dim=0)  # (N,C,H,W)
writer.add_images("augmented_samples", images, epoch)

  add_image()

  • 作用:记录单张或批量图像数据

  • 常用场景:输入数据可视化、模型输出检查、数据增强效果展示

单张图像 (C,H,W)
多张图像 (N,C,H,W)
writer.add_image("input_sample", img_tensor, epoch)# 图像网格 (N,C,H,W)
writer.add_images("augmented_batch", batch_tensor[:8], epoch)

  注意:图像需为 [0,1][-1,1] 范围,支持 torch.TensorPIL.Image。

3. 模型结构可视化

dummy_input = torch.rand(1, 3, 224, 224)  # 匹配模型输入尺寸
writer.add_graph(model, dummy_input)

  add_graph()

  • 作用:可视化模型计算图

  • 常用场景:模型结构调试、算子连接关系检查

dummy_input = torch.rand(1, 3, 224, 224)  # 匹配输入维度
writer.add_graph(model, dummy_input)

  输出:交互式计算图(可展开查看层细节)

4. 直方图与分布

权重分布
writer.add_histogram("conv1_weight", model.conv1.weight, epoch)

梯度分布(训练中记录)
writer.add_histogram("conv1_grad", model.conv1.weight.grad, epoch)

  add_histogram()

  • 作用:记录张量值分布直方图

  • 常用场景:权重/梯度分布监控、激活值分析

权重分布
writer.add_histogram("conv1/weight", model.conv1.weight, epoch)# 梯度分布
writer.add_histogram("fc1/grad", model.fc1.weight.grad, epoch)

  诊断用途:检测梯度消失/爆炸、权重初始化问题 

 

5. 高维数据投影(PCA/t-SNE)

features = ...  # 提取的特征向量 (N, 1024)
labels = ...    # 对应标签 (N,)
writer.add_embedding(features, metadata=labels, tag="features")

  add_embedding()

  • 作用:可视化高维数据的低维投影

  • 常用场景:特征空间分析、聚类效果展示

features = model.get_features(batch)  # (N, 1024)
labels = batch_labels                 # (N,)
writer.add_embedding(
    features,
    metadata=labels,                  # 悬停显示标签
    tag="epoch{}_features".format(epoch),
    global_step=epoch
)

  支持降维方法:PCA, t-SNE, UMAP

6. 超参数记录

hparams = {"lr": 0.01, "batch_size": 64}
metrics = {"accuracy": 0.92}
writer.add_hparams(hparams, metrics)

  add_hparams()

  • 作用:记录超参数组合及对应指标

  • 常用场景:超参数实验对比、最优参数筛选

  hparams = {"lr": 0.01, "batch_size": 128, "optim": "Adam"}
  metrics = {"hparam/accuracy": 0.92, "hparam/loss": 0.15}
  writer.add_hparams(hparams, metrics)

  最佳实践:

  • 使用 hparam/ 前缀统一指标命名

  • 在训练结束时调用

  • 自动生成超参数比较表

完整模板:

import torch
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("runs/mnist_experiment")

# 模拟训练循环
for epoch in range(10):
    train_loss = 0.8 * (0.9 ** epoch)
    val_acc = 1 - 0.2 * (0.9 ** epoch)
    
    # 记录核心指标
    writer.add_scalar("Loss/train", train_loss, epoch)
    writer.add_scalar("Accuracy/val", val_acc, epoch)
    
    # 记录模拟权重
    weights = torch.randn(100) * (0.9 ** epoch)
    writer.add_histogram("fc1_weights", weights, epoch)
    
    # 记录图像(示例)
    if epoch == 0:
        dummy_images = torch.rand(32, 1, 28, 28)
        writer.add_images("mnist_samples", dummy_images, epoch)

# 记录超参数
writer.add_hparams(
    {"lr": 0.01, "bsize": 64},
    {"hparam/accuracy": 0.95, "hparam/loss": 0.1}
)

writer.close()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值