簡體   English   中英

如何使用功能 keras API 在預訓練的非序列 model 中的激活層之后插入丟失層?

[英]How to insert dropout layers after activation layers in a pre-trained non-sequential model using functional keras API?

我正在研究修改后的 resnet,並希望在激活層之后插入 dropout。 我嘗試了以下方法,但由於 model 不是連續的,它不起作用:

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 沒有 output。

    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 或任何其他預訓練網絡中?

所以最終我想出了如何去做; 但它非常hacky。 Go 至:

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

Go 到 resnet.py。 這也將更改 resnetv2 實例,因為它基於原始 resnet。 只需 Cntrl+F 進行激活,您會在其中看到激活層(通常格式為 x = Layer(x),一次構建 model 一層)然后只需添加:x = Dropout(prob)(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

對“激活”的所有類似搜索結果執行此操作。

然后你會看到你的 model 摘要中添加了 dropout。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM