未来我们要学习的:
基础模型:
机器学习对于结构化数据和非结构化数据的应用:
-
结构化数据意味着数据的基本数据库。例如在房价预测中,你可能有一个数据库,有专门的几列数据告诉你卧室的大小和数量,这就是结构化数据。或预测用户是否会点击广告,你可能会得到关于用户的信息,比如年龄以及关于广告的一些信息,然后对你的预测分类标注,这就是结构化数据,意思是每个特征,比如说房屋大小卧室数量,或者是一个用户的年龄,都有一个很好的定义。
-
相反非结构化数据是指比如音频,原始音频或者你想要识别的图像或文本中的内容。这里的特征可能是图像中的像素值或文本中的单个单词。
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.Tensor
或 PIL.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()