如何使用功能性 keras API 在预训练的非序列模型中的激活层之后插入 dropout 层?

时间:2020-12-30 08:33:24

标签: python tensorflow keras resnet dropout

我正在研究修改后的 resnet,并想在激活层之后插入 dropout。 我尝试了以下方法,但由于模型不是连续的,所以没有用:

def add_dropouts(model, probability = 0.5):
    print("Adding Dropouts")
    
    updated_model = tf.keras.models.Sequential()
    for layer in model.layers:
        print("layer = ", layer)
        updated_model.add(layer)
        if isinstance(layer, tf.keras.layers.Activation):
            updated_model.add(tf.keras.layers.Dropout(probability))

    print("updated model Summary = ", updated_model.summary)
    print("model Summary = ", model.summary)

    model = updated_model

    return model


base_model = tf.keras.applications.ResNet50V2(include_top=False, input_shape=input_img_shape, pooling='avg')

base_model = add_dropouts(base_model, probability = 0.5)

然后我使用函数式 API 尝试了我自己的版本,但此方法不起作用并返回值错误,说 Tensor 没有输出。

    prev_layer = base_model.layers[0]
    for layer in base_model.layers:
        next_layer = layer(prev_layer.output)
        if isinstance(layer, tf.keras.layers.Activation):
            next_layer = Dropout(0.5)(next_layer.output)
        prev_layer = next_layer

有谁知道有人会如何将 dropout 层添加到 resnet 或任何其他预训练网络中?

1 个答案:

答案 0 :(得分:0)

所以最终我想出了怎么做;但它非常hacky。前往:

C:\ProgramData\Anaconda3\envs*你的环境名称*\Lib\site-packages\tensorflow\python\keras\applications

转到 resnet.py。这也会改变 resnetv2 实例,因为它是基于原始 resnet 的。只需 Cntrl+F 进行激活,在您看到激活层的地方(通常采用 x = Layer(x) 一次构建模型一层的格式)然后添加: x = 辍学(概率)(x) 下面是一个例子:


  if not preact:
    x = layers.BatchNormalization(
        axis=bn_axis, epsilon=1.001e-5, name='conv1_bn')(x)
    x = layers.Activation('relu', name='conv1_relu')(x)#insert layer after each of these
    x = layers.Dropout(prob)(x) # added dropout

对“激活”的所有类似搜索结果执行此操作。

然后你会看到在你的模型摘要中添加了 dropout。