ud185

Tips

  • 回归问题和二元分类问题经常使用均方损失

  • 前向传播

  • 计算损失

  • 反向传播得到梯度

  • 更新权重(使用优化器)

创建一个分类器

from torch import nn, optim
import torch.nn.functional as F

class Classifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 64)
        self.fc4 = nn.Linear(64, 10)

    def forward(self, x):
        # make sure input tensor is flattened
        x = x.view(x.shape[0], -1)

        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.relu(self.fc3(x))
        x = F.log_softmax(self.fc4(x), dim=1)

        return x

#model = nn.Sequential(nn.Linear(784, 128),
#                      nn.ReLU(),
#                      nn.Linear(128, 64),
#                      nn.ReLU(),
#                      nn.Linear(64, 10),
#                       nn.LogSoftmax(dim=1))

验证分类器

过拟合

  • 早停法 (early stopping) 即:使用验证损失最低的模型,需要频繁保存模型。

  • 丢弃(dropout)即随机丢弃单元

    • self.dropout = nn.Dropout(p=0.2)

      验证的时候关闭dropout, 先使用model.eval()设定为推理模式,计算测试损失和精度后再开启模型训练model.train()启动dropout

保存和加载网络模型

  • torch.savetorch.load

  • PyTorch 网络的参数保存在模型的 state_dict 中。状态字典包含每个层级的权重和偏差矩阵

  • 将状态加载到神经网络中需要执行 model.load_state_dict(state_dict)

    • 只有模型结构和检查点的结构完全一样时,状态字典才能加载成功

  • 可以将模型的架构信息和状态字典都保存在检查点里,可以通过创建一个字典来实现

  • 再次加载模型的时候使用load_checkpoint函数即可正确完成

加载图像数据

数据增强

训练神经网络的一个常见策略是在输入数据本身里引入随机性。例如,你可以在训练过程中随机地旋转、翻转、缩放和/或裁剪图像。这样一来,你的神经网络在处理位置、大小、方向不同的相同图像时,可以更好地进行泛化。

另外,还需要使用 transforms.Normalize 标准化图像。传入均值和标准偏差列表,然后标准化颜色通道

迁移学习

  • 加载 DenseNet 等模型 model = models.densenet121(pretrained=True)

  • 测试GPU是否可用

    PyTorch 和其他深度学习框架一样,也使用 CUDA 在 GPU 上高效地进行前向和反向运算。在 PyTorch 中,你需要使用 model.to('cuda') 将模型参数和其他张量转移到 GPU 内存中。你可以使用 model.to('cpu') 将它们从 GPU 移到 CPU,比如在你需要在 PyTorch 之外对网络输出执行运算时。

Review

Last updated

Was this helpful?