DAY24 迁移式学习与预训练模型

一、迁移式学习(Transfer Learning)

动机

我们在做监督式学习(Supervised Learning)的时候通常会耗费大量时间去训练,且每个专案我们都必须重新开始,时间成本实在太高了,为了解决这个问题,迁移式学习的想法就诞生了。

概念

我们利用"神经网路在前一个任务中学习到的知识"去学习下一个专案,称之为"骨干网路",举例来说,假如你学习过高中的课程後,再让你去学习国中的课程,虽然程度不一样,但你利用先前学习过的知识,学习起来就会相对轻松,迁移式学习就是利用这个概念,让网路学习过一些庞大的资料集,再将权重储存起来,应用在不同的专案中。

资料集

这边要介绍一些经典有名的资料集,我们常常会使用这些数据集所训练出的权重来使用。
最着名的就是ImageNet,它是由普林斯顿大学的李飞飞教授所发起的一项专案,这项专案希望能蒐集到海量的图片作为资料库来做训练,并以这份资料来训练骨干网路,该专案利用发起比赛来蒐集资料,拥有多达1400万张的图片、1000种类别的资料集。
https://ithelp.ithome.com.tw/upload/images/20210914/20140427Fpcc1FqSI8.jpg
图片来源:https://cv.gluon.ai/build/examples_datasets/imagenet.html

其他还有像是MNIST(手写数字的图片)、cifar10(10种类别的图片)等资料集,都是拥有上万张图片以上的资料库,且都有提供开源下载,这些都是我们在做迁移式学习中相当好用的辅助资料集。我们使用这些资料集的权重加到网路上,再稍微修改程序和我们的资料集,这个动作就是微调(Fine-tune)


二、如何使用预训练模型

Keras提供了相当多的骨干网路以及使用办法,连结附在下方给大家参考:
Keras Applications
https://ithelp.ithome.com.tw/upload/images/20210914/20140427xiuEL5tV9D.jpg
这里补充解释一下,上图中的size代表模型大小Top-1 ;Accuracy代表预测一次的准确度、Top-5 Accuracy代表预测五次内正确的准确度;Parameters代表模型总参数量,Depth代表模型深度。

点选你想使用的模型後,就可以查看它的程序码及参数

https://ithelp.ithome.com.tw/upload/images/20210914/20140427R6Yv0aTRb8.jpg
其中的weights="imagenet"就代表我们使用ImageNet的权重来做基底。

查看模型架构

model.summary()

https://ithelp.ithome.com.tw/upload/images/20210914/20140427Qgl653X6c7.jpg
虽然我们使用了别人的网路,但我们还是有一些设计空间的,何况资料集还是我们自己的,因此要将这个网路的Input与Output改成资料及所对应的格式。

范例如下

inputs = tf.keras.Input(shape=(3,))
x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs)
outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)

三、微调预训练模型之方法

在使用预训练模型时要注意是否和自己的资料集相差过大,避免使用错误的模型来训练资料,而根据资料集的特性去微调模型的方法有以下几点:

直接采用预训练模型的架构与权重

通常是我们的资料集与预训练模型的资料集情况相当类似,我们就只需要修改输入层与输出层的结构就好,这也是最理想的方式。

冻结部分层,训练其他层

假如这份资料集与预训练模型的资料情况有些差异,我们需要的特徵可能就需要重新提取,但如果我们的资料集又不多,就可以选择这种方式,冻结神经网路中前面几层,不做权重的修改,而放开後面几层重新做特徵的提取,这个方法往往要花较多时间尝试冻结层数的平衡。

不使用预训练模型

其实在一种情况下我们可以完全舍弃预训练模型的权重,那就是我们的资料集足够多的情况,且资料与预训练权重的差异度又过大,这时我们完全有足够的资料量让神经网路学习,我们就可以从头搭建网路来进行训练。


四、结论

以现阶段来说,我们还是有极高的机会去使用到预训练模型,因为我们实在很难蒐集到一份海量的资料集,透过使用前人留下的经验,我们可已大大的优化自己的模型,今天程序实作的部分比较少,就留到之後的专案实作吧!


<<:  Day22. 谁说画面只能写在Erb - 一起在helper写画面

>>:  DAY25 轻量级模型-MobileNets

Day.5 留个纪录好办事 - Mysql Log (日志纪录)-上

遇到系统出问题时,第一个动作会是去查看系统上的Log纪录,各种日志都纪录着不同用途,透过日志纪录的内...

javascript表单资料处理&验证(DAY22)

这篇文章会介绍如何使用DOM来处理表单的物件存取,以及利用条件判断式来处理表单的验证,像是在上一篇的...

Windows 安装 PHP IMagick

根据很多网路上的教学,需要两个主要档案 php_imagick.xxx.zip ImageMagic...

[CodeIgniter 3] 记忆体的隐形杀手:Log all queries

前言 CodeIgniter作为轻量化的PHP框架 db物件一直是操作资料库的好帮手 简化了下达sq...

Day 03 : ML in Production 的挑战

在 Day2 提到什麽是用於生产的机械学习 ML in Production ,今天来谈用於生产的机...