“冻结”层指的是该层不参加网络训练,即该层的参数不会更新。“冻结”层主要有以下两个应用场景:
1)使用预训练模型进行fine-tune时,我们需要在预训练模型后面添加几层进行训练,而前面的预训练模型不进行参数更新;
2)当我们训练好模型,需要取出中间层的embedding再进行后续处理的时候,也需要这个操作。
Keras层是否进行参数更新可通过属性trainable来控制。我们可以直接在定义网络层的时候来指定trainable属性,
frozen_layer = Dense(32,trainable=False)
但是这种方法我没有找到什么应用场景,因为网络参数都是随机初始化的,如果不进行参数更新,那么该层的作用是什么?
下面还是以上述两种常用的场景做Keras“冻结”层的用法的分析。以导入预训练模型为例,
from keras.layers import Dropout, Flatten, Dense, Input
from keras.applications.resnet50 import ResNet50
from keras.models import Model, optimizers
def create_model(nb_class):
input_shape = (197, 197, 3)
inputs = Input(shape=input_shape)
# 预训练模型
pretrained_model = ResNet50(include_top=False,
weights&