问题描述
我正在研究修改后的 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 或任何其他预训练网络中?
解决方法
所以最终我想出了怎么做;但它非常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。