欢迎光临散文网 会员登陆 & 注册

pytorch深度学习-01: CNN for dogs vs cats

2023-07-05 18:49 作者:Magician-Artist  | 我要投稿


  • Using CNN for dogs vs cats

    • 数据预处理

      • 数据集:catsvsdogs

      • 正则化 mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] 目的是对每个通道的像素点去除亮度的影响

      • 数据集加载 torch.utils.data.DataLoader(dsets['train'], batch_size=64, shuffle=True, num_workers=6) shuffle表示打乱,使每个epoch遍历的数据顺序都不一样; num_workers表示加载数据的通道数

    • VGG模型与微调

      • 加载预训练模型 model_vgg = models.vgg16(pretrained=True) 

      • 数据读取和训练 

        • 1. 样本、标签、模型 .to(device)

        • 2. 模型训练 outputs_try = model_vgg(inputs_try)

      • 修改最后一层,微调以适配二分类任务

        • 冻结前面层的权重 param.requires_grad = False 

        • 修改最后一层输出size 从1000变为2 model_vgg.classifier._modules['6'] = nn.Linear(4096, 2) 

        • 增加一层LogSoftmax计算输出的概率值 torch.nn.LogSoftmax(dim = 1)

        • 重新应用模型 model = model.to(device)

      • 训练修改后的整个模型

        • 定义损失函数 criterion NLLLOSS() 负对数似然函数损失: -sum(y_ture * log(y_pred))

        • 定义优化器 optimizer torch.optim.SGD() 核心思想是根据梯度来更新神经网络的参数

        • 模型训练

          • 0. 清零梯度optimizer.zero_grad()  以便进行新一轮的梯度计算

          • 1.前向传播 outputs = model(inputs) 

          •  2.计算损失 loss = criterion(outputs,classes) (一个批次的) 

          • 3.反向传播,计算梯度 loss.backward()  

          • 4.参数更新 optimizer.step()  

          • 预测概率&类别 _,preds = torch.max(outputs.data,1)

          • 输出指标: epoch_loss = 总损失/batch_size; epoch_acc = 预测值正确/batch_size

        • 模型测试

          • 输入样本和类别依然需要 .to(device)

          • 预测值需要转化成cpu形式 .to('cpu').numpy()

    • 预计算加快学习速度

      • 原理:训练数据不再是原始图像,而是经过模型特征提取器之后的特征结果,从而大大加快训练速度。由于只修改了最后一层,所以前面层的中间结果都是相同的,可以保存下来以避免重复计算。(即把特征提取的结果保存下来)然后再用这些特征来进行训练。

      • x = model_vgg.features(inputs) 保存特征

      • 重新加载训练数据和标签,重新配置DataLoder,重新训练(每个epoch速度很快)


pytorch深度学习-01: CNN for dogs vs cats的评论 (共 条)

分享到微博请遵守国家法律