pytorch 固定部分参数训练的方法

在PyTorch中,有时候我们需要固定部分参数进行训练,例如在迁移学习中,我们可能只想训练模型的最后几层,而不是整个模型。本文将提供一个完整的攻略,介绍如何在PyTorch中固定部分参数进行训练。我们将提供两个示例,分别是使用requires_grad和使用nn.ModuleList固定部分参数进行训练。

示例1:使用requires_grad固定部分参数进行训练

以下是一个示例,展示如何使用requires_grad固定部分参数进行训练。

1. 导入库

import torch
import torch.nn as nn
import torch.optim as optim

2. 定义模型

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(x, 2)
        x = nn.functional.relu(self.conv2(x))
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(-1, 16 * 5 * 5)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = Net()

3. 固定部分参数

for param in net.parameters():
    param.requires_grad = False

for param in net.fc3.parameters():
    param.requires_grad = True

4. 定义损失函数和优化器

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.fc3.parameters(), lr=0.001, momentum=0.9)

5. 训练模型

for epoch in range(2):  # 多次循环数据集

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 2000 == 1999:    # 每2000个小批量数据打印一次损失值
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

示例2:使用nn.ModuleList固定部分参数进行训练

以下是一个示例,展示如何使用nn.ModuleList固定部分参数进行训练。

1. 导入库

import torch
import torch.nn as nn
import torch.optim as optim

2. 定义模型

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv_layers = nn.ModuleList([
            nn.Conv2d(3, 6, 5),
            nn.Conv2d(6, 16, 5)
        ])
        self.fc_layers = nn.ModuleList([
            nn.Linear(16 * 5 * 5, 120),
            nn.Linear(120, 84),
            nn.Linear(84, 10)
        ])

    def forward(self, x):
        for layer in self.conv_layers:
            x = nn.functional.relu(layer(x))
            x = nn.functional.max_pool2d(x, 2)
        x = x.view(-1, 16 * 5 * 5)
        for layer in self.fc_layers:
            x = nn.functional.relu(layer(x))
        return x

net = Net()

3. 固定部分参数

for i, layer in enumerate(net.conv_layers):
    if i == 0:
        for param in layer.parameters():
            param.requires_grad = False
    else:
        for param in layer.parameters():
            param.requires_grad = True

4. 定义损失函数和优化器

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

5. 训练模型

for epoch in range(2):  # 多次循环数据集

    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 2000 == 1999:    # 每2000个小批量数据打印一次损失值
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

总结

本文提供了一个完整的攻略,介绍了如何在PyTorch中固定部分参数进行训练。我们提供了两个示例,分别是使用requires_grad和使用nn.ModuleList固定部分参数进行训练。在实现过程中,我们使用了PyTorch的requires_grad和nn.ModuleList,并使用了backward()函数计算梯度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch 固定部分参数训练的方法 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • pytorch 数据拼接与拆分cat、stack、split、chunck

    1、cat拼接 功能:通过dim指定维度,在当前指定维度上直接拼接 默认是dim=0 指定的dim上,维度可以不相同,其他dim上维度必须相同,不然会报错。 1)拼接两个维度相同的数 a = torch.rand(2, 3, 2) a # 输出: tensor([[[0.6072, 0.6531], [0.2023, 0.2506], [0.0590, 0.…

    PyTorch 2023年4月8日
    00
  • Windows安装Anaconda并且配置国内镜像的详细教程

    以下是Windows安装Anaconda并配置国内镜像的详细攻略: 步骤1:下载Anaconda 首先,您需要从Anaconda官网下载适用于Windows的Anaconda安装程序。您可以在以下网址下载:https://www.anaconda.com/products/distribution。 步骤2:安装Anaconda 下载完成后,双击安装程序并按…

    PyTorch 2023年5月15日
    00
  • PyTorch模型读写、参数初始化、Finetune

    使用了一段时间PyTorch,感觉爱不释手(0-0),听说现在已经有C++接口。在应用过程中不可避免需要使用Finetune/参数初始化/模型加载等。 模型保存/加载 1.所有模型参数 训练过程中,有时候会由于各种原因停止训练,这时候我们训练过程中就需要注意将每一轮epoch的模型保存(一般保存最好模型与当前轮模型)。一般使用pytorch里面推荐的保存方法…

    2023年4月8日
    00
  • Pytorch自定义数据集

    自定义数据集的代码如下: import os import pandas as pd from torchvision.io import read_image class CustomImageDataset(Dataset): def __init__(self, annotations_file, img_dir, transform=None, ta…

    PyTorch 2023年4月8日
    00
  • pytorch(十九):MNIST打印准确率和损失

    一、例子            二、整体代码 import torch from torch.nn import functional as F import torch.nn as nn import torchvision from torchvision import datasets,transforms import torch.optim as …

    PyTorch 2023年4月7日
    00
  • pytorch repeat 和 expand 函数的使用场景,区别

    x = torch.tensor([0, 1, 2, 3]).float().view(4, 1)def test_assign(x): # 赋值操作 x_expand = x.expand(-1, 3) x_repeat = x.repeat(1, 3) x_expand[:, 1] = torch.tensor([0, -1, -2, -3]) x_re…

    PyTorch 2023年4月8日
    00
  • Pytorch实验常用代码段汇总

    当进行PyTorch实验时,我们经常需要使用一些常用的代码段来完成模型训练、数据处理、可视化等任务。本文将详细讲解PyTorch实验常用代码段汇总,并提供两个示例说明。 1. 模型训练 在PyTorch中,我们可以使用torch.optim模块中的优化器和nn模块中的损失函数来训练模型。以下是模型训练的示例代码: import torch import to…

    PyTorch 2023年5月15日
    00
  • python与pycharm有何区别

    Python是一种编程语言,而PyCharm是一种Python集成开发环境(IDE)。本文将介绍Python和PyCharm的区别,并演示如何使用PyCharm进行Python开发。 Python和PyCharm的区别 Python是一种高级编程语言,它具有简单易学、开发效率高等特点,被广泛应用于数据分析、人工智能、Web开发等领域。Python的优点包括:…

    PyTorch 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部