Pytorch极简入门教程(十四)——学习速率衰减

学习速率衰减

导入必要的模块
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

import torchvision
from torchvision import transforms
from torch.utils.data import DataLoader
import os
导入数据
base_dir = r"./dataset/4Weather"
train_dir = os.path.join(base_dir, "train")
test_dir = os.path.join(base_dir, "test")
训练集和测试集的配置
train_transform = transforms.Compose([
    transforms.Resize(224),
    transforms.RandomResizedCrop(192, scale=(0.6, 1.0), ratio=(0.8, 1.0)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(0.2),
    torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0),
    torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0),
    transforms.ToTensor(),
    transforms.Normalize(mean=[.5, .5, .5], std=[0.5,0.5,0.5])
])

train_ds = torchvision.datasets.ImageFolder(
    train_dir,
    transform = train_transform
)

test_transform = transforms.Compose([
    transforms.Resize((192, 192)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5])
])
test_ds = torchvision.datasets.ImageFolder(
    test_dir,
    transform = test_transform
)

BATCH_SIZE = 32
train_dl = DataLoader(
    train_ds,
    batch_size = BATCH_SIZE,
    shuffle = True
)
test_dl = DataLoader(
    test_ds,
    batch_size = BATCH_SIZE,
)
定义VGG16模型
model = torchvision.models.vgg16(pretrained=True, progress=True)
print("model:",model)
冻结基础网络
for para in model.features.parameters():
    para.require_grad = False

model.classifier[-1].out_features =4
定义优化器和学习速度
if torch.cuda.is_available():
    model.to("cuda")
loss_fn = nn.CrossEntropyLoss()
# 学习率衰减
from torch.optim import lr_scheduler
optimizer = torch.optim.Adam(
    model.classifier.parameters(),
    lr = 0.001
)
exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
定义评判标准
def fit(epoch, model, trainloader, testloader):
    correct = 0
    total = 0
    running_loss = 0
    for x, y in trainloader:
        if torch.cuda.is_available():
            # 获取训练集
            x, y = x.to("cuda"), y.to("cuda")

        # 正向及反向传播
        y_pred = model(x)
        loss = loss_fn(y_pred, y)
        # 权重参数梯度清零
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        with torch.no_grad():
            y_pred = torch.argmax(y_pred, dim=1)
            correct += (y_pred==y).sum().item()
            total += y.size(0)
            running_loss += loss.item()

    exp_lr_scheduler.step()
    epoch_loss = running_loss / len(trainloader.dataset)
    epoch_acc = correct / total

    test_correct = 0
    test_total = 0
    test_running_loss = 0

    with torch.no_grad():
        for x, y in testloader:
            if torch.cuda.is_available():
                x, y = x.to("cuda"), y.to("cuda")
            y_pred = model(x)
            loss = loss_fn(y_pred, y)
            y_pred = torch.argmax(y_pred, dim=1)
            test_correct += (y_pred==y).sum().item()
            test_total += y.size(0) 
            test_running_loss += loss.item()

    epoch_test_loss = test_running_loss / len(testloader.dataset)
    epoch_test_acc = test_correct / test_total

    print("epoch:", epoch,
          "loss:", round(epoch_loss, 3),
          "accuracy:", round(epoch_acc, 3),
          "test_loss:", round(epoch_test_loss, 3),
          "test_acc:", round(epoch_test_acc, 3)
          )
    return epoch_loss, epoch_acc, epoch_test_loss, epoch_test_acc

开启训练和测试
Epochs = 100
train_loss = []
train_acc = []
test_loss =[]
test_acc = []
for epoch in range(Epochs):
    epoch_loss, epoch_acc, epoch_test_loss, epoch_test_acc = fit(epoch, model, train_dl, test_dl)
    train_loss.append(epoch_loss)
    train_acc.append(epoch_acc)
    test_loss.append(epoch_test_acc)
    test_acc.append(epoch_test_acc)

plt.plot(range(1, Epochs+1), train_loss, label="train_loss")
plt.plot(range(1, Epochs+1), test_loss, label="test_loss")
plt.legend()

plt.plot(range(1, Epochs+1), train_acc, label="train_acc")
plt.plot(range(1, Epochs+1), test_acc, label="test_acc")
plt.show()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个广泛应用于深度学习的开源机器学习库,它提供了丰富的工具和接口,使得开发者可以更加便捷地构建和训练深度神经网络模型。 PyTorch极简入门教程可以通过以下几个步骤进行: 1. 安装PyTorch:首先需要在计算机中安装PyTorch库。可以通过官方网站或者使用包管理工具(如pip或conda)进行安装。安装完成后,可以在Python环境中导入PyTorch库。 2. 张量操作:PyTorch的核心是张量(Tensor),它是一个多维数组。学习如何创建、操作和使用张量是入门的关键。可以学习如何创建随机张量、更改张量形状、进行基本数学运算等。 3. 构建模型:在PyTorch中构建模型通常使用nn.Module类。可以学习如何定义自己的模型类,包括初始化函数、前向传播函数等。还可以学习如何添加层和激活函数,并了解常用的网络结构,如全连接层、卷积层等。 4. 训练模型:在PyTorch中训练模型通常需要定义损失函数和优化器。可以学习如何选择合适的损失函数,如交叉熵损失函数,以及常用的优化器,如随机梯度下降优化器。还可以学习如何使用训练数据批次来进行前向传播和反向传播,并进行参数更新。 5. 测试和评估:在训练完成后,需要对模型进行测试和评估。可以学习如何使用测试数据进行模型预测,并计算预测结果的准确率、精确率、召回率等指标。 虽然PyTorch入门教程只有300字,但这些步骤可以帮助初学者了解PyTorch的基本概念和操作。通过实践和深入学习,可以逐渐掌握更多高级功能和技巧,从而更好地应用PyTorch进行深度学习研究和应用开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值