迁移学习和微调( 以Xception为基础模型在Kaggle Dogs vs. Cats 猫狗分类问题上为例)

本文详细介绍了如何利用TensorFlow和Keras进行迁移学习,包括冻结层、构建基于预训练模型的新模型、微调步骤,以及一个完整的端到端示例,涉及数据预处理、模型构建、训练和微调。通过实例展示了在ImageNet预训练的Xception模型上进行Kaggle Dogs vs Cats分类任务的全过程。

 

目录

简介

冻结层

迁移学习工作流

微调

参考

注意事项


简介

当前目标的数据集数据太少,无法训练一个有效的模型时,可以使用迁移学习。因为一般情况下,在某种大型数据集上训练出来的模型,含有大量的特征,这些特征可用于类似的新问题。深度学习中迁移学习的一般流程:

   1从某训练好的模型中获取层并冻结

   2在其顶部添加一些可训练的层,这些层能够将模型适应你的新的数据集

   3训练你添加的新层

   4最后可选地进行微调(微调会对整体模型进一步训练)

下面以tensorflow keras为例进一步说明。

冻结层

   层和模型具有布尔特性 trainable。此特性的值可以更改。将 layer.trainable 设置为 False 会将层的所有权重从可训练移至不可训练。这一过程称为“冻结”层:已冻结层的状态在训练期间不会更新(无论是使用 fit() 进行训练,还是使用依赖于 trainable_weights 来应用梯度更新的任何自定义循环进行训练时)。一般而言,所有权重都是可训练权重。唯一具有不可训练权重的内置层是 BatchNormalization 层(参考文章末尾的链接)。另外注意,如果在模型或具有子层的任何层上设置 trainable = False,则所有子层也将变为不可训练。

如下代码所示:

Dense 层具有 2 个可训练权重(内核与偏差)在训练期间,它使用不可训练权重跟踪其输入的平均值和方差。

BatchNormalization 层具有 2 个可训练权重和 2 个不可训练权重

import numpy as np
import tensorflow as tf
from tensorflow import keras

#Dense 层具有 2 个可训练权重(内核与偏差)在训练期间,它使用不可训练权重跟踪其输入的平均值和方差。
layer = keras.layers.Dense(3)
layer.build((None, 4))  # Create the weights
print("weights:", len(layer.weights))
print("trainable_weights:", len(layer.trainable_weights))
print("non_trainable_weights:", len(layer.non_trainable_weights))

#BatchNormalization 层具有 2 个可训练权重和 2 个不可训练权重
layer = keras.layers.BatchNormalization()
layer.build((None, 4))  # Create the weights
print("weights:", len(layer.weights))
print("trainable_weights:", len(layer.trainable_weights))
print("non_trainable_weights:", len(layer.non_trainable_weights))

#实施冻结
layer = keras.layers.Dense(3)
layer.build((None, 4))  # Create the weights
layer.trainable = False  # Freeze the layer
print("weights:", le
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alocus_

如果我的内容帮助到你,打赏我吧

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

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

打赏作者

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

抵扣说明:

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

余额充值