[英]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.