【问题标题】:Is there a way to freeze specific layers in a KerasLayer?有没有办法冻结 KerasLayer 中的特定图层?
【发布时间】:2020-08-16 10:23:47
【问题描述】:

我目前正在构建一个使用迁移学习对图像进行分类的 CNN。 在我的模型中,有一个 tensorflow-hub KerasLayer 使用 EfficientNet 来创建特征向量。

我的代码在这里:

model = models.Sequential([
hub.KerasLayer("https://tfhub.dev/google/efficientnet/b7/feature-vector/1", trainable=True), # Trainable
layers.Dropout(DROPOUT),
layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),
layers.Dropout(DROPOUT),
layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),
layers.Dropout(DROPOUT),
layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),
layers.Dropout(DROPOUT),
layers.Dense(NEURONS_PER_LAYER, kernel_regularizer=tf.keras.regularizers.l2(REG_LAMBDA), activation=ACTIVATION),
layers.Dropout(DROPOUT),
layers.Dense(1, activation="sigmoid")])

我可以冻结或解冻整个 KerasLayer,但我似乎无法找到一种方法来仅冻结较早的层并微调更高级别的部分。有人可以帮忙吗?

【问题讨论】:

    标签: tensorflow machine-learning computer-vision tensorflow2.0


    【解决方案1】:

    您可以使用layer.trainable = False 冻结整个图层。万一您碰巧加载了整个模型或从头开始创建模型,您可以执行此循环以找到要冻结的特定层。

    # load a model or create a model
    model = Model(...)
    
    # first you print out your model summary
    model.summary()
    
    # you will get something like this
    ''' 
    Model: "sequential_2"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    inception_resnet_v2 (Model)  (None, 2, 2, 1536)        54336736  
    _________________________________________________________________
    flatten_2 (Flatten)          (None, 6144)              0         
    _________________________________________________________________
    dropout_2 (Dropout)          (None, 6144)              0         
    _________________________________________________________________
    dense_8 (Dense)              (None, 2048)              12584960  
    _________________________________________________________________
    dense_9 (Dense)              (None, 1024)              2098176   
    _________________________________________________________________
    dense_10 (Dense)             (None, 512)               524800    
    _________________________________________________________________
    dense_11 (Dense)             (None, 17)                8721      
    =================================================================
    '''
    
    # here is loop for freezing particular layer (dense_10 in this example)
    for layer in model.layers:
        # selecting layer by name
        if layer.name == 'dense_10':
            layer.trainable = False
    
    # for that hub layer you need to create hub layer outside your model just for easy access
    
    # my inception layer
    inception_layer = keras.applications.InceptionResNetV2(weights='imagenet', include_top=False, input_shape=(128, 128, 3))
    
    # create model
    model.add(inception_layer)
    
    # same trick
    inception_layer.summary()
    
    # here is same loop from upper example
    for layer in inception_layer.layers:
        # selecting layer by name
        if layer.name == 'block8_10_conv':
            layer.trainable = False
    
    

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 2011-10-16
      • 2020-03-07
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多