迁移学习冻结网络的方法:

本文探讨了如何在PyTorch和TensorFlow中实现模型的精细调优,包括如何冻结层、调整优化器参数和利用tf.get_collection管理可训练变量,以节省内存和提高训练效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:pytorch(1-3),TensorFlow(4)

fine tune就是冻结网络前面的层,然后训练最后一层

  1. 给优化器传入所有参数,但将要冻结层的参数的requires_grad置为False:
    optimizer = optim.SGD(model.parameters(), lr=1e-2)  # 传入的是所有的参数
    
    for name, param in model.named_parameters():
        if 要冻结的网络层的名字(即name的值):
            param.requires_grad = False
  2. 优化器传入不冻结的网络层的参数:
    optimizer = optim.SGD(model.不冻结的网络层的name.parameters(), lr=1e-2)  # 优化器只传入fc2的参数
  3. 最优做法是:优化器只传入requires_grad=True的参数,占用的内存会更小一点,效率也会更高。代码及结合1和2
    1. 节省显存:不将不更新的参数传入optimizer

    2. 提升速度:将不更新的参数的requires_grad设置为False,节省了计算这部分参数梯度的时间

  4. 代码如下:
    #定义优化算子
    optimizer = tf.train.AdamOptimizer( 1e-3)
    #选择待优化的参数
    output_vars = tf.get_collection(tf.GraphKyes.TRAINABLE_VARIABLES, scope= 'outpt')
    train_step = optimizer.minimize(loss_score,var_list = output_vars)

    把需要更新梯度的层放在tf.get_collection这个函数里面,不需要更新的不放进去。
    1. 函数主要作用:从一个集合中取出变量
    2. 用来获取key集合中的所有元素,返回一个列表。列表的顺序依变量放入集合中的先后而定。scope为可选参数,表示的是名称空间(名称域),如果指定,就返回名称域中所有放入‘key’的变量的列表(如示例代码中的outpt说明是返回outpt层的参数),不指定则返回所有变量。
### 关于迁移学习中的冻结层与微调 在深度学习领域,迁移学习是一种常见的技术,用于利用在一个数据集上训练的模型的知识来解决另一个相关问题。以下是关于冻结层和微调的具体实现方法及其背后的原理。 #### 冻结层的作用 冻结层是指在迁移学习过程中,将预训练模型的部分或全部权重设置为不可更新的状态。这样做的目的是保护这些层中已有的特征提取能力不被破坏,尤其是在目标数据集较小的情况下。通过冻结某些层,可以防止梯度下降过程改变这些层的参数,从而保留原始模型的有效特性[^3]。 ```python from tensorflow.keras.applications import VGG16 from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras.models import Model # 加载VGG16预训练模型,排除顶层分类器 base_model = VGG16(weights='imagenet', include_top=False) # 冻结基础模型的所有层 for layer in base_model.layers: layer.trainable = False ``` 上述代码展示了如何加载一个预训练的VGG16模型,并将其所有层设为不可训练状态。这种操作通常发生在添加自定义的新层之前。 #### 添加新层 为了使预训练模型适用于新的任务,可以在冻结的基础模型之上附加额外的可训练层。这些新增加的层负责将从原任务中学到的通用特征映射为目标任务所需的特定表示形式。 ```python x = Flatten()(base_model.output) x = Dense(256, activation='relu')(x) predictions = Dense(num_classes, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) ``` 此片段说明了怎样构建一个新的全连接网络作为顶部结构,该结构能够针对具体的应用场景进行优化。 #### 微调的概念及实践 当初步完成基于新数据集的训练之后,可以选择进一步执行微调步骤。这意味着允许先前冻结的一部分甚至整个模型参与后续迭代期间的小幅度调整。需要注意的是,在实施微调阶段时应显著降低学习速率,以免剧烈变动损害已有成果。 ```python # 解冻部分卷积块供微调 for layer in base_model.layers[-4:]: if not isinstance(layer, BatchNormalization): layer.trainable = True # 编译模型,采用较低的学习率 optimizer = tf.keras.optimizers.Adam(lr=1e-5) model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) ``` 以上脚本演示了解锁选定几层以及配置适配微调需求的优化算法的过程。 #### 总结 综上所述,迁移学习中的冻结层主要是为了避免重要信息丢失;而微调则是为了让整体架构更好地契合当前的任务背景。两者结合使用能有效提升模型性能,特别是在样本数量有限的情形下尤为明显。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值