不见春山
骑马倚斜桥,满楼红袖招。
Home
Categories
Archives
Tags
About
Home
迁移学习入门
迁移学习入门
取消
迁移学习入门
由
ctaoist
发布于 2022-04-12
·
最后更新:2022-06-30
1
## 简介 迁移学习(transfer learning)通俗来讲,就是运用已有的知识来学习新的知识,核心是找到已有知识和新知识之间的相似性,用成语来说就是举一反三。由于直接对目标域从头开始学习成本太高,我们故而转向运用已有的相关知识来辅助尽快地学习新知识。比如,已经会下中国象棋,就可以类比着来学习国际象棋;已经会编写Java程序,就可以类比着来学习C#;已经学会英语,就可以类比着来学习法语;等等。世间万事万物皆有共性,如何合理地找寻它们之间的相似性,进而利用这个桥梁来帮助学习新知识,是迁移学习的核心问题。 在迁移学习中,我们已有的知识叫做**源域(source domain)**,要学习的新知识叫**目标域(target domain)**。迁移学习研究如何把源域的知识迁移到目标域上。特别地,在机器学习领域中,迁移学习研究如何将已有模型应用到新的不同的、但是有一定关联的领域中。传统机器学习在应对数据的分布、维度,以及模型的输出变化等任务时,模型不够灵活、结果不够好,而迁移学习放松了这些假设。在数据分布、特征维度以及模型输出变化条件下,有机地利用源域中的知识来对目标域更好地建模。另外,在有标定数据缺乏的情况下,迁移学习可以很好地利用相关领域有标定的数据完成数据的标定。 ![](https://blog.qiniu.ctaoist.cn/迁移学习简介.png) 迁移学习的**核心思想**是希望将源域与目标域映射到同一特征空间,然后寻找源域和目标域之间分布的特征相似性,最后通过衡量源域和目标域之间分布的差异,完成两域之间的特征迁移。 迁移学习按照学习方式可以分为**基于样本**的迁移,**基于特征**的迁移,**基于模型**的迁移,以及**基于关系**的迁移。基于样本的迁移通过对源域中有标定样本的加权利用完成知识迁移;基于特征的迁移通过将源域和目标域映射到相同的空间(或者将其中之一映射到另一个的空间中)并最小化源域和目标域的距离来完成知识迁移;基于模型的迁移将源域和目标域的模型与样本结合起来调整模型的参数;基于关系的迁移则通过在源域中学习概念之间的关系,然后将其类比到目标域中,完成知识的迁移。 ## 为什么需要迁移学习 - 原始数据很多,但有标注的很少,标注的代价很昂贵 - 大数据需要强计算设备,这些设备往往比较昂贵,减少计算量 - 普适性模型和个性化需求往往矛盾 ## 负迁移 如果说成功的迁移学习是“举一反三”、“照猫画虎”,那么负迁移则是“东施效颦”。两个领域之间不存在相似性,或者基本不相似,那么,就会大大损害迁移学习的效果。 **负迁移**指的是,在源域上学习到的知识,对于目标域上的学习产生负面作用。 产生负迁移的原因主要有: - 数据问题:源域和目标域压根不相似,谈何迁移? - 方法问题:源域和目标域是相似的,但是,迁移学习方法不够好,没找到可迁移的成 分。 ## Tensorflow 迁移学习初体验 网上很多教程都是直接使用训练好的基础模型,但如何自己训练基础模型缺语焉不详。在很多实际使用环境中还是需要自己训练基础模型的。 迁移学习很重要的一点就是冻结模型中的卷积层,有两种方式: 1. 将需要冻结的层单独存放 ```py inputs = tf.keras.Input(shape=(160, 160, 3)) x = tf.keras.layers.Conv2D(32, kernel_size=(3, 3), padding='same', activation="relu", name = 'conv1')(x) x = tf.keras.layers.Conv2D(64, kernel_size=(3, 3), padding='same', activation="relu", name = 'conv1')(x) output = tf.keras.layers.Flatten(name = 'flatten1')(x) base_model = tf.keras.models.Model(inputs=inputs, outputs=output, name = 'base_model') ... # 基础模型训练完成后 base_model.trainable = False # 冻结层 ## 或者 x = base_model(base_model.input, training=False) # 这样也可以冻结 x = tf.keras.layers.Dense(512, activation='relu', name = 'dense1')(x) ... ``` 2. keras 通过 `model.get_layer(layer_name)` 或者 `model.layers[nth]` 提取输出 假定已经训练好一个模型:`init_modle`: ```py base_model_output = init_model.get_layer("flatten1").output # modle.layers[6] x = tf.keras.layers.Dense(512, activation='relu', name = 'dense1')(base_model_output) x = tf.keras.layers.Dense(128, activation='relu', name = 'dense2')(x) output = tf.keras.layers.Dense(2, activation='softmax', name = 'output')(x) fine_tune_model = tf.keras.models.Model(inputs=init_model.input, outputs=output, name = 'fine_tune_model') # 手动冻结 for layer in fine_tune_model.layers[:6]: layer.trainable = False ``` 3. 通过 `models.Model()` 提取模型 假定已经训练好一个模型:`init_modle`: ```py base_model = tf.keras.models.Model(inputs=init_model.input, outputs=init_model.get_layer("flatten1").output, name = 'base_model') base_model.trainable = False ``` ## 参考 - [matlab 官方例子](https://ww2.mathworks.cn/help/deeplearning/gs/get-started-with-transfer-learning.html) - [Tensorflow 官方例子](https://tensorflow.google.cn/tutorials/images/transfer_learning) - [keras提取模型中的某一层_Tensorflow笔记:高级封装](https://www.cxyzjd.com/article/weixin_34374684/112312268)
机器学习
机器学习
Tensorflow
Keras
迁移学习
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
群晖升级 ARPL 笔记
本地部署大语言模型
WireGuard 搭建组网教程
LVM 管理
HK1 RBOX X4 电视盒子折腾笔记
热门标签
机器学习
Tensorflow
Linux
VPN
虚拟组网
Router
ROS
嵌入式
C++
C
文章目录
反向传播原理的理解
N2N 搭建教程