'Adding Dropout Layers to Segmentation_Models Resnet34 with Keras

I want to use the Segmentation_Models UNet (with ResNet34 Backbone) for uncertainty estimation, so i want to add some Dropout Layers into the upsampling part. The Model is not Sequential, so i think i have to reconnect some outputs to the new Dropout Layers and the following layer inputs to the output of Dropout.

I'm not sure, whats the right way to do this. I'm currently trying this:

# 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)

This throws the following Error: AttributeError: 'KerasTensor' object has no attribute 'output'

But I think I'm doing something wrong. Does anybody have a Solution for this?



Solution 1:[1]

There is a problem with the Resnet model you are using. It is complex and has Add and Concatenate layers (residual layers, I guess), which take as input a list of tensors from several "subnetworks". In other words, the network is not linear, so you can't walk through the model with a simple loop.

Regarding your error, in the loop of your code: layer is a layer and updated_model_layers is a tensor (functional API). Therefore, updated_model_layers.output does not exist. You confuse the two a bit

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1