迁移学习【一】:实现神经网络层的冻结

一、意义和目的

在得到训练好的模型后,常采用迁移学习将模型应用到其他任务中,迁移学习的步骤为:在初次训练的基础上对额外的新数据再训练,微调网络参数。迁移学习的这种方式可以不从头训练网络 ,节约大量的计算资源和时间开销。在用新数据对模型进行微调的过程中,往往需要冻结大多数的网络层。如何冻结网络层是本文要解决的问题

总而言之,迁移学习的步骤就是:
①训练模型
②冻结模型部分层(一般指除全连接层外的所有层)←(本章内容)
——————————————————————————————
③在冻结的层后增加或替换层
④使用新数据重新训练,这时候学习率要很小(俗称微调fine-turning)

二、本文实现工具

本章着重讲下如何实现冻结网络层,后续操作都建立在训练获得某个网络的前提下进行(即①中部分已实现),实现工具和示例网络如下。

算法实现语言Python
神经网络框架Tensorflow/Keras
所用网络LSTM

PS:Keras是Tensorflow2.0以上版本的高阶API。

三、冻结网络的代码实现

3.1 导入包

import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential
from tensorflow.keras.models import Model
import pickle, random

3.2 构建网络(2层2LSTM)

num_classes = 10
input=Input(shape=(32, 32))
layer1 = LSTM(32, return_sequences=True)(input)
layer2 = LSTM(32, return_sequences=True)(layer1)
x = Flatten()(layer2)
layer_dense1 = Dense(num_classes, name="dense1")(x)
layer_softmax = Activation('softmax')(layer_dense1)
output = Reshape([num_classes])(layer_softmax)

model = Model(inputs=input, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'],experimental_run_tf_function=False)
model.summary()

在这里插入图片描述

3.3 冻结网络层

假设前面构建好的网络已经训练好了(训练与否并不影响,因为只是模型权重参数不同而已,操作都一样,实际应用的时候记得训练即可)
在冻结前,可以看到所有层都是可训练。
在这里插入图片描述

3.3.1 方式一:迭代冻结层

for layer in model.layers:    
#     model.get_layer('lstm').trainable= False
    model.trainable = False
    print(layer.trainable)

trainable表示可训练的层,冻结后
在这里插入图片描述
一般来说,迁移学习中会选择冻结除全连接层之前的所有层(如下图圈中部分)。对于本文的2层LSTM模型结构,冻结方式如下

for layer in model.layers [:-3]:
    print(layer.name)
    layer.trainable = False

在这里插入图片描述

3.3.2 方式二:冻结指定层(扩展内容)

这个方式看看就好,在层比较少的情况下可以使用。重点关注方式一

冻结指定层需要知道层的名称,以下生成的图例表格中第一列中可以知道(去括号)
如果要冻结lstm_1所在层,只需输入lstm_1的名称:

model.get_layer('lstm_1').trainable= False

在这里插入图片描述

下一章 迁移学习【二】:实现微调(fine-turning)

  • 13
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
在MATLAB中,我们可以使用freezeWeights函数来冻结神经网络冻结神经网络意味着在训练过程中不会更新这些的权重和偏置。这在某些情况下可以帮助我们保持原有的网络结构和特征提取能力,而不会受到后续训练数据的影响。 要冻结神经网络,首先需要将网络加载到MATLAB的工作空间中。然后,我们可以使用freezeWeights函数将指定的冻结。该函数的输入参数是冻结的名称,如net(5)或conv1。我们还可以使用冻结内容作为freezeWeights函数的第二个输入参数。例如,'biases'表示冻结偏置,'weights'表示只冻结权重,而'both'表示同时冻结权重和偏置。 以下是一个示例,展示了如何使用MATLAB中的freezeWeights函数冻结神经网络: ```matlab % 加载预训练的神经网络 net = alexnet; % 查看网络结构 disp(net.Layers); % 冻结前两个卷积的权重和偏置 layersToFreeze = {'conv1', 'conv2'}; for i = 1:length(layersToFreeze) layerIndex = net.getLayerIndex(layersToFreeze{i}); net = freezeWeights(net, layerIndex, 'both'); end % 查看冻结 disp(net.Layers); ``` 通过以上代码,我们可以冻结AlexNet网络的前两个卷积的权重和偏置。最后,我们可以通过查看网络的结构来确认这些已被成功冻结冻结神经网络可以在一些迁移学习任务中非常有用,特别是当我们希望保留预训练模型中的某些特征提取能力而不希望对它们进行微调时。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sinysama

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

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

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

打赏作者

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

抵扣说明:

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

余额充值