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

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

被折叠的 条评论
为什么被折叠?



