def __init__(self, model, epsilon=1e-1, *args, **kwargs): self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), #TODO: fix. specify. extend. ("LRPSequentialPresetB is not advised " "for networks with non-ReLU activations."), check_type="warning", ) class EpsilonProxyRule(rrule.EpsilonRule): def __init__(self, *args, **kwargs): super(EpsilonProxyRule, self).__init__(*args, epsilon=epsilon, bias=True, **kwargs) conditional_rules = [(kchecks.is_dense_layer, EpsilonProxyRule), (kchecks.is_conv_layer, rrule.Alpha2Beta1Rule)] bn_layer_rule = kwargs.pop("bn_layer_rule", rrule.AlphaBetaX2m100Rule) super(LRPSequentialPresetB, self).__init__(model, *args, rule=conditional_rules, bn_layer_rule=bn_layer_rule, **kwargs)
def __init__(self, model, epsilon=1e-1, *args, **kwargs): self._model_checks = [ # TODO: Check for non-linear output in general. { "check": lambda layer: kchecks.contains_activation( layer, activation="softmax"), "type": "exception", "message": "Model should not contain a softmax.", }, { "check": lambda layer: not kchecks.only_relu_activation(layer), "type": "warning", "message": (" is not advised for " "networks with non-ReLU activations.") #TODO: fix. specify. extend. } ] class EpsilonProxyRule(rrule.EpsilonRule): def __init__(self, *args, **kwargs): super(EpsilonProxyRule, self).__init__(*args, epsilon=epsilon, bias=True, **kwargs) conditional_rules = [(kchecks.is_dense_layer, EpsilonProxyRule), (kchecks.is_conv_layer, rrule.Alpha2Beta1Rule) ] super(LRPSequentialPresetB, self).__init__(model, *args, rule = conditional_rules, **kwargs )
def __init__(self, model, **kwargs): super().__init__(model, **kwargs) # Add and run model checks self._add_model_softmax_check() self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), "Deconvnet is only specified for networks with ReLU activations.", check_type="exception", ) self._do_model_checks()
def __init__(self, model, percentile=98, **kwargs): self._percentile = percentile self._add_model_softmax_check() self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), "RectGrad is only specified for " "networks with ReLU activations.", check_type="exception", ) super(RectGrad, self).__init__(model, **kwargs)
def __init__(self, model: Model, *args, **kwargs) -> None: super().__init__(model, *args, **kwargs) # Add and run model checks self._add_model_softmax_check() self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), "This DeepTaylor implementation only supports ReLU activations.", check_type="exception", ) self._do_model_checks()
def __init__(self, model, *args, **kwargs): self._add_model_check( lambda layer: kchecks.is_batch_normalization_layer(layer), "DeepTaylor (currently) does not support BachNormalization layer.", check_type="exception", ) self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), "This DeepTaylor implementation only supports ReLU activations.", check_type="exception", ) super(DeepTaylor, self).__init__(model, *args, **kwargs)
def __init__(self, model: Model, **kwargs): # Inside function to not break import if Keras changes. super().__init__(model, **kwargs) # Add and run model checks self._add_model_softmax_check() self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), "BaselineLRPZ only works with ReLU activations.", check_type="exception", ) self._add_model_check( lambda layer: not isinstance(layer, BASELINE_LRPZ_LAYERS), "BaselineLRPZ only works with a predefined set of layers.", check_type="exception", ) self._do_model_checks()
def __init__(self, model, patterns=None, pattern_type=None, **kwargs): super().__init__(model, **kwargs) # Add and run model checks self._add_model_softmax_check() self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), ("PatternNet is not well defined for networks with non-ReLU activations." ), check_type="warning", ) self._add_model_check( lambda layer: not kchecks.is_convnet_layer(layer), ("PatternNet is only well defined for convolutional neural networks." ), check_type="warning", ) self._add_model_check( lambda layer: not isinstance(layer, SUPPORTED_LAYER_PATTERNNET), ("PatternNet is only well defined for conv2d/max-pooling/dense layers." ), check_type="exception", ) self._do_model_checks() self._patterns = patterns if self._patterns is not None: # copy pattern references self._patterns = list(patterns) self._pattern_type = pattern_type # Pattern projections can lead to +-inf value with long networks. # We are only interested in the direction, therefore it is save to # Prevent this by projecting the values in bottleneck layers to +-1. if not kwargs.get("reverse_project_bottleneck_layers", True): warnings.warn( "The standard setting for 'reverse_project_bottleneck_layers'" "is overwritten.") else: kwargs["reverse_project_bottleneck_layers"] = True
def __init__(self, model, **kwargs): # Inside function to not break import if Keras changes. BASELINELRPZ_LAYERS = ( keras.engine.topology.InputLayer, keras.layers.convolutional.Conv1D, keras.layers.convolutional.Conv2D, keras.layers.convolutional.Conv2DTranspose, keras.layers.convolutional.Conv3D, keras.layers.convolutional.Conv3DTranspose, keras.layers.convolutional.Cropping1D, keras.layers.convolutional.Cropping2D, keras.layers.convolutional.Cropping3D, keras.layers.convolutional.SeparableConv1D, keras.layers.convolutional.SeparableConv2D, keras.layers.convolutional.UpSampling1D, keras.layers.convolutional.UpSampling2D, keras.layers.convolutional.UpSampling3D, keras.layers.convolutional.ZeroPadding1D, keras.layers.convolutional.ZeroPadding2D, keras.layers.convolutional.ZeroPadding3D, keras.layers.core.Activation, keras.layers.core.ActivityRegularization, keras.layers.core.Dense, keras.layers.core.Dropout, keras.layers.core.Flatten, keras.layers.core.Lambda, keras.layers.core.Masking, keras.layers.core.Permute, keras.layers.core.RepeatVector, keras.layers.core.Reshape, keras.layers.core.SpatialDropout1D, keras.layers.core.SpatialDropout2D, keras.layers.core.SpatialDropout3D, keras.layers.local.LocallyConnected1D, keras.layers.local.LocallyConnected2D, keras.layers.Add, keras.layers.Concatenate, keras.layers.Dot, keras.layers.Maximum, keras.layers.Minimum, keras.layers.Subtract, keras.layers.noise.AlphaDropout, keras.layers.noise.GaussianDropout, keras.layers.noise.GaussianNoise, keras.layers.normalization.BatchNormalization, keras.layers.pooling.GlobalMaxPooling1D, keras.layers.pooling.GlobalMaxPooling2D, keras.layers.pooling.GlobalMaxPooling3D, keras.layers.pooling.MaxPooling1D, keras.layers.pooling.MaxPooling2D, keras.layers.pooling.MaxPooling3D, ) self._add_model_softmax_check() self._add_model_check( lambda layer: not kchecks.only_relu_activation(layer), "BaselineLRPZ only works with ReLU activations.", check_type="exception", ) self._add_model_check( lambda layer: not isinstance(layer, BASELINELRPZ_LAYERS), "BaselineLRPZ only works with a predefined set of layers.", check_type="exception", ) super(BaselineLRPZ, self).__init__(model, **kwargs)
def __init__(self, model, allow_lambda_layers=False, **kwargs): # Inside function to not break import if Keras changes. BASELINELRPZ_LAYERS = ( keras.engine.topology.InputLayer, keras.layers.convolutional.Conv1D, keras.layers.convolutional.Conv2D, keras.layers.convolutional.Conv2DTranspose, keras.layers.convolutional.Conv3D, keras.layers.convolutional.Conv3DTranspose, keras.layers.convolutional.Cropping1D, keras.layers.convolutional.Cropping2D, keras.layers.convolutional.Cropping3D, keras.layers.convolutional.SeparableConv1D, keras.layers.convolutional.SeparableConv2D, keras.layers.convolutional.UpSampling1D, keras.layers.convolutional.UpSampling2D, keras.layers.convolutional.UpSampling3D, keras.layers.convolutional.ZeroPadding1D, keras.layers.convolutional.ZeroPadding2D, keras.layers.convolutional.ZeroPadding3D, keras.layers.core.Activation, keras.layers.core.ActivityRegularization, keras.layers.core.Dense, keras.layers.core.Dropout, keras.layers.core.Flatten, keras.layers.core.Lambda, keras.layers.core.Masking, keras.layers.core.Permute, keras.layers.core.RepeatVector, keras.layers.core.Reshape, keras.layers.core.SpatialDropout1D, keras.layers.core.SpatialDropout2D, keras.layers.core.SpatialDropout3D, keras.layers.local.LocallyConnected1D, keras.layers.local.LocallyConnected2D, keras.layers.Add, keras.layers.Concatenate, keras.layers.Dot, keras.layers.Maximum, keras.layers.Minimum, keras.layers.Subtract, keras.layers.noise.AlphaDropout, keras.layers.noise.GaussianDropout, keras.layers.noise.GaussianNoise, keras.layers.normalization.BatchNormalization, keras.layers.pooling.GlobalMaxPooling1D, keras.layers.pooling.GlobalMaxPooling2D, keras.layers.pooling.GlobalMaxPooling3D, keras.layers.pooling.MaxPooling1D, keras.layers.pooling.MaxPooling2D, keras.layers.pooling.MaxPooling3D, ) self._model_checks = [ # todo: Check for non-linear output in general. { "check": lambda layer: kchecks.contains_activation( layer, activation="softmax"), "type": "exception", "message": "Model should not contain a softmax.", }, { "check": lambda layer: not kchecks.only_relu_activation(layer), "type": "exception", "message": ("BaselineLRPZ is not working for " "networks with non-ReLU activations."), }, { "check": lambda layer: not isinstance(layer, BASELINELRPZ_LAYERS), "type": "exception", "message": ("BaselineLRPZ is only defined for " "certain layers."), }, { "check": lambda layer: (not allow_lambda_layers and isinstance(layer, keras.layers.core.Lambda)), "type": "exception", "message": ("Lamda layers are not allowed. " "To allow use allow_lambda_layers kw."), }, ] self._allow_lambda_layers = allow_lambda_layers super(BaselineLRPZ, self).__init__(model, **kwargs)
def test_only_relu_activation(activation, layer, expected): assert ichecks.only_relu_activation(layer) == expected