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

yizhihongxing

在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实现加载保存查看checkpoint文件

    在PyTorch中,我们可以使用checkpoint文件来保存和加载模型的状态。checkpoint文件包含了模型的权重、优化器的状态以及其他相关信息。在本文中,我们将详细介绍如何使用PyTorch来加载、保存和查看checkpoint文件。 加载checkpoint文件 在PyTorch中,我们可以使用torch.load函数来加载checkpoint文件…

    PyTorch 2023年5月15日
    00
  • Pytorch 搭建分类回归神经网络并用GPU进行加速的例子

    PyTorch搭建分类回归神经网络并用GPU进行加速的例子 在本文中,我们将介绍如何使用PyTorch搭建分类回归神经网络,并使用GPU进行加速。本文将包含两个示例说明。 示例一:使用PyTorch搭建分类神经网络 我们可以使用PyTorch搭建分类神经网络。示例代码如下: import torch import torch.nn as nn import …

    PyTorch 2023年5月15日
    00
  • 关于pytorch中全连接神经网络搭建两种模式详解

    PyTorch 中全连接神经网络搭建两种模式详解 在 PyTorch 中,全连接神经网络是一种常见的神经网络模型。本文将详细讲解 PyTorch 中全连接神经网络的搭建方法,并提供两个示例说明。 1. 模式一:使用 nn.Module 搭建全连接神经网络 在 PyTorch 中,我们可以使用 nn.Module 类来搭建全连接神经网络。以下是使用 nn.Mo…

    PyTorch 2023年5月16日
    00
  • pytorch转onnx问题

     Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchAddExportSupport.md#fail-to-export-the-model-in-pytorch 1. RuntimeError: ONNX ex…

    2023年4月8日
    00
  • Pytorch划分数据集的方法:torch.utils.data.Subset

        Pytorch提供的对数据集进行操作的函数详见:https://pytorch.org/docs/master/data.html#torch.utils.data.SubsetRandomSampler torch的这个文件包含了一些关于数据集处理的类: class torch.utils.data.Dataset: 一个抽象类, 所有其他类的数据…

    PyTorch 2023年4月6日
    00
  • 对pytorch网络层结构的数组化详解

    PyTorch网络层结构的数组化详解 在PyTorch中,我们可以使用nn.ModuleList()函数将多个网络层组合成一个数组,从而实现网络层结构的数组化。以下是一个示例代码,演示了如何使用nn.ModuleList()函数实现网络层结构的数组化: import torch import torch.nn as nn # 定义网络层 class Net(…

    PyTorch 2023年5月15日
    00
  • pytorch 在sequential中使用view来reshape的例子

    在PyTorch中,我们可以使用Sequential模块来构建神经网络。Sequential模块允许我们按照顺序添加一系列的层,从而构建一个完整的神经网络。在Sequential模块中,我们可以使用view函数来对张量进行reshape操作,以适应不同的层的输入和输出形状。 以下是两个使用Sequential模块和view函数的示例: 示例1:使用Seque…

    PyTorch 2023年5月15日
    00
  • 使用pytorch测试单张图片(test single image with pytorch)

    以下代码实现使用pytorch测试一张图片 引用文章: https://www.learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/ from __future__ import print_function, division from PI…

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