07_PyTorch 模型训练[优化器]

接04_PyTorch 模型训练[Finetune 之权值初始化]代码

代码与输出:

(1) 将fc3层的参数从原始网络参数中剔除

print("fc3层: ",net.fc3)
print("fc3层参数种类数: ",len(list(net.fc3.parameters())))
print("10个神经元里的正常参数 10x84:" ,list(net.fc3.parameters())[0].shape)
print("10个神经元里的偏置参数 10x1:" ,list(net.fc3.parameters())[1].shape)

# 将fc3层的参数从原始网络参数中剔除  fc3
#id() 函数返回对象的唯一标识符,标识符是一个整数。 
#CPython 中 id() 函数用于获取对象的内存地址。
#map() 会根据提供的函数对指定序列做映射。
#得到了正常参数和偏置参数的内存地址
ignored_params = list(map(id, net.fc3.parameters()))


#filter用于过滤序列,过滤掉不符合条件的元素,返回由符合条件的元素组成的新列表
base_params = filter(lambda p: id(p) not in ignored_params, net.parameters())

(2)为fc3层单独设置需要的学习率

lr_init = 0.001
# 为fc3层设置需要的学习率
optimizer = optim.SGD([
    {'params': base_params},
    {'params': net.fc3.parameters(), 'lr': lr_init*10}],  lr_init, momentum=0.9, weight_decay=1e-4)

(3)选择损失函数和学习率调整测量

criterion = nn.CrossEntropyLoss()                                            # 选择损失函数
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)     # 设置学习率调整策略

(4)开始训练

from torch.autograd import Variable
max_epoch = 5
for epoch in range(max_epoch):

    loss_sigma = 0.0    # 记录一个epoch的loss之和
    correct = 0.0
    total = 0.0
    scheduler.step()  # 更新学习率

    for i, data in enumerate(train_loader):  #一批一批得读,直到读完
        # 获取图片和标签
        inputs, labels = data #inputs torch.Size([16, 3, 32, 32])  # labels torch.Size([16])

        #Variable是篮子,而tensor是鸡蛋,鸡蛋应该放在篮子里才能方便拿走
        #Variable这个篮子里除了装了tensor外还有requires_grad参数,表示是否需要对其求导,默认为False
        inputs, labels = Variable(inputs), Variable(labels)

        # forward, backward, update weights
        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # 统计预测信息
        #torch.max 返回每一行(dim = 1)最大元素和对应的索引
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).squeeze().sum().numpy()
        loss_sigma += loss.item()

        # 每10个iteration 打印一次训练信息,loss为10个iteration的平均
        if i % 10 == 9:
            loss_avg = loss_sigma / 10
            loss_sigma = 0.0
            print("Training: Epoch[{:0>3}/{:0>3}] Iteration[{:0>3}/{:0>3}] Loss: {:.4f} Acc:{:.2%}".format(
                epoch + 1, max_epoch, i + 1, len(train_loader), loss_avg, correct / total))
            print('参数组1的学习率:{}, 参数组2的学习率:{}'.format(scheduler.get_lr()[0], scheduler.get_lr()[1]))

 (5)测试集

import numpy as np
    classes_name = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
 # ------------------------------------ 观察模型在验证集上的表现 ------------------------------------
    loss_sigma = 0.0
    cls_num = len(classes_name)
    conf_mat = np.zeros([cls_num, cls_num])  # 混淆矩阵
    net.eval()
    for i, data in enumerate(valid_loader):

        # 获取图片和标签
        images, labels = data
        images, labels = Variable(images), Variable(labels)

        # forward
        outputs = net(images)
        outputs.detach_()

        # 计算loss
        loss = criterion(outputs, labels)
        loss_sigma += loss.item()

        # 统计
        _, predicted = torch.max(outputs.data, 1)
        # labels = labels.data    # Variable --> tensor

        # 统计混淆矩阵
        for j in range(len(labels)):
            cate_i = labels[j].numpy()
            pre_i = predicted[j].numpy()
            conf_mat[cate_i, pre_i] += 1.0

    print('{} set Accuracy:{:.2%}'.format('Valid', conf_mat.trace() / conf_mat.sum()))
    print('Finished Training')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: segmentation_models_pytorch 是一个基于 PyTorch 的图像分割库,可以用来训练语义分割模型。下面是使用 segmentation_models_pytorch 实现单模型训练的基本步骤: 1. 安装 segmentation_models_pytorch 和其依赖项: ``` pip install segmentation-models-pytorch ``` 2. 加载数据集并进行预处理。可以使用 torchvision 或者其他图像处理库加载数据集,并对数据进行预处理,如裁剪、缩放、归一化等操作。 3. 定义模型。使用 segmentation_models_pytorch 中提供的模型类(如 UNet、FPN、PSPNet 等)来定义模型。 ```python import segmentation_models_pytorch as smp model = smp.Unet( encoder_name="resnet34", # 使用 ResNet34 作为编码 encoder_weights="imagenet", # 加载预训练权重 in_channels=3, # 输入通道数 classes=2, # 分类数 ) ``` 4. 定义损失函数和优化。可以选择使用交叉熵损失函数和 Adam 优化。 ```python import torch.nn as nn import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 5. 训练模型。使用 DataLoader 加载数据集,并对模型进行训练。 ```python from torch.utils.data import DataLoader train_loader = DataLoader(dataset, batch_size=4, shuffle=True) for epoch in range(num_epochs): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}") ``` 6. 保存模型训练完毕后,可以使用 torch.save() 方法将模型保存到本地。 ```python torch.save(model.state_dict(), "model.pth") ``` ### 回答2: segmentation_models_pytorch是一个基于PyTorch实现的语义分割模型库。使用segmentation_models_pytorch实现单模型训练可以通过以下步骤完成。 首先,安装segmentation_models_pytorch库。可以通过pip install segmentation_models_pytorch命令来安装。 导入所需的库和模型。常用的库包括torch,torchvision和segmentation_models_pytorch。可以使用以下命令导入库: ```python import torch import torchvision.transforms as transforms import segmentation_models_pytorch as smp ``` 加载和预处理训练数据。可以使用torchvision中的transforms来定义一系列的数据预处理操作,例如裁剪、缩放和标准化等。之后,使用torch.utils.data.DataLoader来加载和批量处理数据。 定义模型架构。可以选择使用segmentation_models_pytorch中预定义的模型架构,例如UNet、PSPNet和DeepLab等。根据任务需求选择合适的模型,并初始化相关参数。 定义优化和损失函数。常见的优化有Adam和SGD等,损失函数常选择交叉熵损失函数。可以使用torch.optim中的函数来定义优化,使用torch.nn中的损失函数来定义损失函数。 进行模型训练。使用torch.utils.data.DataLoader加载训练数据集,并迭代训练数据集中的每个批次。将批次数据输入模型中进行前向传播,获取模型的输出。计算损失,并进行反向传播更新模型的参数。重复以上步骤直到达到预定的训练轮数或达到设定的训练目标。 保存和加载训练好的模型。可以使用torch.save函数将训练好的模型保存到指定的文件路径,使用torch.load函数加载保存的模型文件。 以上是使用segmentation_models_pytorch实现单模型训练的基本步骤。根据具体任务和数据的不同,可能还需要进行一些细节操作,例如数据增强、学习率调整和模型评估等。 ### 回答3: segmentation_models_pytorch是一个基于PyTorch的分割模型训练库,可以应用于图像分割任务。下面我将介绍如何使用segmentation_models_pytorch实现单模型训练。 首先,我们需要安装segmentation_models_pytorch库。可以使用pip命令进行安装: ``` pip install segmentation-models-pytorch ``` 在训练之前,我们需要准备好训练数据和标签。通常情况下,训练数据是一些图像,标签则是对应每个像素点的分类或分割结果。 接下来,我们需要导入所需的库: ``` import segmentation_models_pytorch as smp import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, Dataset ``` 然后,我们需要创建一个自定义的数据集类,该类继承自torch.utils.data.Dataset类,并实现__len__和__getitem__方法,用于加载和处理数据。 接着,我们可以选择一个合适的分割模型,比如Unet、FPN等。这些模型可以通过调用smp库中的函数进行初始化,比如: ``` model = smp.Unet( encoder_name="resnet34", encoder_weights="imagenet", classes=1, activation='sigmoid' ) ``` 在这里,我们选择了一个使用ResNet-34作为编码、预训练权重为ImageNet数据集、分类数为1(二分类问题)的Unet模型。 然后,我们可以定义损失函数和优化: ``` criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 接着,我们可以进行训练循环,依次迭代数据进行训练优化: ``` for epoch in range(num_epochs): for batch in dataloader: inputs, labels = batch optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 最后,我们可以保存模型并在需要预测时加载模型进行测试: ``` torch.save(model.state_dict(), "segmentation_model.pt") model.load_state_dict(torch.load("segmentation_model.pt")) ``` 以上就是使用segmentation_models_pytorch实现单模型训练的过程。根据具体任务需求,你也可以调整模型、损失函数、优化等参数来进行更灵活的训练

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无情的阅读机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值