我们在做监督式学习(Supervised Learning)的时候通常会耗费大量时间去训练,且每个专案我们都必须重新开始,时间成本实在太高了,为了解决这个问题,迁移式学习的想法就诞生了。
我们利用"神经网路在前一个任务中学习到的知识"去学习下一个专案,称之为"骨干网路",举例来说,假如你学习过高中的课程後,再让你去学习国中的课程,虽然程度不一样,但你利用先前学习过的知识,学习起来就会相对轻松,迁移式学习就是利用这个概念,让网路学习过一些庞大的资料集,再将权重储存起来,应用在不同的专案中。
这边要介绍一些经典有名的资料集,我们常常会使用这些数据集所训练出的权重来使用。
最着名的就是ImageNet,它是由普林斯顿大学的李飞飞教授所发起的一项专案,这项专案希望能蒐集到海量的图片作为资料库来做训练,并以这份资料来训练骨干网路,该专案利用发起比赛来蒐集资料,拥有多达1400万张的图片、1000种类别的资料集。
图片来源:https://cv.gluon.ai/build/examples_datasets/imagenet.html
其他还有像是MNIST(手写数字的图片)、cifar10(10种类别的图片)等资料集,都是拥有上万张图片以上的资料库,且都有提供开源下载,这些都是我们在做迁移式学习中相当好用的辅助资料集。我们使用这些资料集的权重加到网路上,再稍微修改程序和我们的资料集,这个动作就是微调(Fine-tune)
Keras提供了相当多的骨干网路以及使用办法,连结附在下方给大家参考:
Keras Applications
这里补充解释一下,上图中的size代表模型大小Top-1 ;Accuracy代表预测一次的准确度、Top-5 Accuracy代表预测五次内正确的准确度;Parameters代表模型总参数量,Depth代表模型深度。
其中的weights="imagenet"就代表我们使用ImageNet的权重来做基底。
model.summary()
虽然我们使用了别人的网路,但我们还是有一些设计空间的,何况资料集还是我们自己的,因此要将这个网路的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写画面
遇到系统出问题时,第一个动作会是去查看系统上的Log纪录,各种日志都纪录着不同用途,透过日志纪录的内...
这篇文章会介绍如何使用DOM来处理表单的物件存取,以及利用条件判断式来处理表单的验证,像是在上一篇的...
根据很多网路上的教学,需要两个主要档案 php_imagick.xxx.zip ImageMagic...
前言 CodeIgniter作为轻量化的PHP框架 db物件一直是操作资料库的好帮手 简化了下达sq...
在 Day2 提到什麽是用於生产的机械学习 ML in Production ,今天来谈用於生产的机...