深度学习15—(迁移学习)冻结和解冻神经网络模型的参数

发布时间:2024年01月07日

冻结与解冻代码:?

def freeze_net(net):
    if not net:
        return
    for p in net.parameters():
        p.requires_grad = False


def unfreeze_net(net):
    if not net:
        return
    for p in net.parameters():
        p.requires_grad = True

这段代码定义了两个函数:`freeze_net` 和 `unfreeze_net`,这两个函数的目的是分别冻结和解冻一个神经网络模型的参数,控制是否对模型参数进行梯度计算。以下是对这两个函数的详细解释:

# 当调用此函数后,模型的参数将不再参与梯度计算,即在反向传播过程中不会更新这些参数的梯度值
# 输入参数 net 是一个 PyTorch 模型对象
def freeze_net(net):
    
    # 检查 net 是否为 None 或者为空,如果是则直接返回,不进行任何操作
    if not net:
        return
    
    # 通过设置 p.requires_grad = False,将参数的梯度计算设置为不可用(冻结)
    for p in net.parameters():
        p.requires_grad = False

        
# 当调用此函数后,模型的参数将重新参与梯度计算,即在反向传播过程中会更新这些参数的梯度值
def unfreeze_net(net):
    
    # 检查 net 是否为 None 或者为空,如果是则直接返回,不进行任何操作
    if not net:
        return
    
    # 对模型的每个参数进行遍历,通过设置 p.requires_grad = True,将参数的梯度计算设置为可用(解冻)
    for p in net.parameters():
        p.requires_grad = True

这两个函数对于模型微调(fine-tuning)和迁移学习(transfer learning)等场景非常有用。例如,在迁移学习中,你可能希望冻结预训练模型的一部分参数,只更新模型的最后几层以适应新任务。通过这两个函数,可以方便地控制模型参数的梯度计算状态。

文章来源:https://blog.csdn.net/m0_55196097/article/details/135430529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。