pytorch

pytorch官方文档
squeeze和unsqueeze函数
momentum动量
contiguous
view

各种可能会用到的pytorch包

1
2
3
4
5
6
7
import torch
import torchvision
from torchvision import transforms,datasets
import torch.nn.functional as F
from torch import nn, optim #optim是优化算法包
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader #不能一次性加载所有数据时,使用小批量训练

  1. import torchvision.transforms as t1
    from torchvision import transforms as t2
    等价效果,区别主要不在结果,而在加载路径和作用域。
    入口不同
    import torchvision.transforms as transforms
    → 直接定位到 torchvision.transforms 这个子模块。
    from torchvision import transforms
    → 先加载顶层包 torchvision,然后通过它的属性找到 transforms 子模块。
    from torchvision import transforms 能工作,是因为 torchvision/init.py 文件里写了类似:
    from torchvision import transforms
    或者做了 all 暴露。
    如果某个包没有在 init.py 里显式暴露子模块,用这种写法就会失败,而 import xxx.yyy 不会。
    可读性风格差异
    import torchvision.transforms as transforms 明确告诉读者:”我只关心 transforms 子模块”。
    from torchvision import transforms 看起来像是”我先拿整个 torchvision,再取里面的 transforms”。

  2. device = “cuda:0” if torch.cuda.is_available() else “cpu” device = torch.device(“cuda:0” if torch.cuda.is_available() else “cpu”)
    两种写法表面一样,但其实得到的对象类型不一样。
    第一种device是字符串 (str)。这种写法是合法的,因为大多数 PyTorch API(如 .to(device)、.to(“cuda:0”))内部会自动识别字符串并转成torch.device,但其本质上不是torch.device对象。
    第二种device则是torch.device对象,因为更加规范,所以PyTorch 内部所有地方都保证能识别。
    多数情况下都能使用,但第二种更规范更推荐使用。

  3. 不指定dtype默认使用:torch.get_default_dtype(),一般是 torch.float32

Tesorboard

可参考
Pytorch的TensorBoard
TensorFlow的TensorBoard
TensorBoard入门

TensorBoard 可以实时绘制训练损失、验证损失、准确率等多种曲线
计算图:TensorBoard 可以显示模型的计算图(graph),帮助你理解模型的架构和各层之间的关系。

层级结构:不仅可以看到层次结构,还能查看每一层的维度,帮助调试和优化模型。
TensorBoard 可以展示各层的权重、偏置等参数的分布,以及在训练过程中的变化,这有助于分析模型的训练状态。
TensorBoard 支持图像、音频和文本数据的可视化,可以直观展示训练过程中处理的数据样本。

为什么不用 plt 或者 ax2:
虽然 matplotlib(plt 或 ax2)也能绘制图表,但它的功能较为基础,无法直接支持 TensorFlow 的训练过程和模型结构的实时跟踪。TensorBoard 的优势在于它是专为深度学习训练过程设计的工具,能处理大量实时更新的数据,并提供对模型结构、参数和训练过程的深度分析。而 matplotlib 通常用于静态的图表绘制,不适合处理训练过程中的动态更新数据、模型结构和多实验对比。

torch.optim 是一个实现了各种优化算法的包。
使用 torch.optim必须构造一个优化器对象,该对象将保存当前状态并根据计算出的梯度更新参数。构造一个 Optimizer,必须为其提供一个可迭代对象,该对象包含要优化的参数(都应该是 Parameter 类型)或命名参数((str, Parameter) 元组)。然后可以指定优化器特定的选项,例如学习率、权重衰减等。
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) SGD带动量
所有优化器都实现了一个 step() 方法,该方法用于更新参数。
optimizer.step()是大多数优化器支持的简化版本。该函数可以在使用例如 backward() 计算梯度后调用。

torch.nn(nn)是专门为神经网络设计的模块化接口
class torch.nn.Module(*args, **kwargs),所有神经网络模块的基类。

1
2
3
4
5
6
7
8
9
10
11
12
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
def __init__(self) -> None:
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)

def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))

torch.nn.functional(F)

transforms.ToTensor()
将PIL Image或numpy.ndarray转换成张量