使用Keras将Dropout Layers添加到Segmentation_Models Resnet34



我想使用Segmentation_Models UNet(带有ResNet34主干)进行不确定性估计,所以我想在上采样部分添加一些Dropout Layers。模型不是顺序的,所以我想我必须将一些输出重新连接到新的Dropout Layers,并将下面的层输入重新连接到Dropout的输出。

我不确定,做这件事的正确方法是什么。我目前正在尝试这个:

# create model
model = sm.Unet('resnet34', classes=1, activation='sigmoid', encoder_weights='imagenet')
# define optimizer, loss and metrics
optim = tf.keras.optimizers.Adam(0.001)
total_loss = sm.losses.binary_focal_dice_loss # or sm.losses.categorical_focal_dice_loss
metrics = ['accuracy', sm.metrics.IOUScore(threshold=0.5), sm.metrics.FScore(threshold=0.5)]
# get input layer
updated_model_layers = model.layers[0]
# iterate over old model and add Dropout after given Convolutions
for layer in model.layers[1:]:
# take old layer and add to new Model
updated_model_layers = layer(updated_model_layers.output)
# after some convolutions, add Dropout
if layer.name in ['decoder_stage0b_conv', 'decoder_stage0a_conv', 'decoder_stage1a_conv', 'decoder_stage1b_conv', 'decoder_stage2a_conv',
'decoder_stage2b_conv', 'decoder_stage3a_conv', 'decoder_stage3b_conv', 'decoder_stage4a_conv']:

if (uncertain):
# activate dropout in predictions
next_layer = Dropout(0.1) (updated_model_layers, training=True)
else:
# add dropout layer
next_layer = Dropout(0.1) (updated_model_layers)
# add reconnected Droput Layer
updated_model_layers = next_layer
model = Model(model.layers[0], updated_model_layers)

这会引发以下错误:AttributeError: 'KerasTensor' object has no attribute 'output'

但我觉得我做错了什么。有人能解决这个问题吗?

您使用的Resnet模型有问题。它很复杂,并且具有Add和Concatenate层(我想是残差层),它们将来自几个"层"的张量列表作为输入;子网络";。换句话说,网络不是线性的,所以你不能用一个简单的循环遍历模型。

关于您的错误,在代码的循环中:层是一个层,updated_model_layers是一个张量(函数API)。因此,updated_model_layers.output不存在。你把两者混淆了一点

相关内容

最新更新