Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 176 additions & 0 deletions modelaudit/config/generated_keras_layers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
"""Generated Keras layer inventory.

Regenerate this file with `scripts/generate_keras_layer_inventory.py` after
updating the Keras reference version used for scanner maintenance.
"""

GENERATED_KNOWN_SAFE_KERAS_LAYER_CLASSES: frozenset[str] = frozenset(
{
"Activation",
"ActivityRegularization",
"AdaptiveAveragePooling1D",
"AdaptiveAveragePooling2D",
"AdaptiveAveragePooling3D",
"AdaptiveMaxPooling1D",
"AdaptiveMaxPooling2D",
"AdaptiveMaxPooling3D",
"Add",
"AdditiveAttention",
"AlphaDropout",
"Attention",
"AugMix",
"AutoContrast",
"Average",
"AveragePooling1D",
"AveragePooling2D",
"AveragePooling3D",
"AvgPool1D",
"AvgPool2D",
"AvgPool3D",
"BatchNormalization",
"Bidirectional",
"CategoryEncoding",
"CenterCrop",
"Concatenate",
"Conv1D",
"Conv1DTranspose",
"Conv2D",
"Conv2DTranspose",
"Conv3D",
"Conv3DTranspose",
"ConvLSTM1D",
"ConvLSTM2D",
"ConvLSTM3D",
"Convolution1D",
"Convolution1DTranspose",
"Convolution2D",
"Convolution2DTranspose",
"Convolution3D",
"Convolution3DTranspose",
"Cropping1D",
"Cropping2D",
"Cropping3D",
"CutMix",
"Dense",
"DepthwiseConv1D",
"DepthwiseConv2D",
"Discretization",
"Dot",
"Dropout",
"ELU",
"EinsumDense",
"Embedding",
"Equalization",
"Flatten",
"FlaxLayer",
"Functional",
"GRU",
"GRUCell",
"GaussianDropout",
"GaussianNoise",
"GlobalAveragePooling1D",
"GlobalAveragePooling2D",
"GlobalAveragePooling3D",
"GlobalAvgPool1D",
"GlobalAvgPool2D",
"GlobalAvgPool3D",
"GlobalMaxPool1D",
"GlobalMaxPool2D",
"GlobalMaxPool3D",
"GlobalMaxPooling1D",
"GlobalMaxPooling2D",
"GlobalMaxPooling3D",
"GroupNormalization",
"GroupQueryAttention",
"HashedCrossing",
"Hashing",
"Identity",
"InputLayer",
"InputSpec",
"IntegerLookup",
"JaxLayer",
"LSTM",
"LSTMCell",
"Lambda",
"Layer",
"LayerNormalization",
"LeakyReLU",
"Masking",
"MaxNumBoundingBoxes",
"MaxPool1D",
"MaxPool2D",
"MaxPool3D",
"MaxPooling1D",
"MaxPooling2D",
"MaxPooling3D",
"Maximum",
"MelSpectrogram",
"Minimum",
"MixUp",
"Model",
"MultiHeadAttention",
"Multiply",
"Normalization",
"PReLU",
"Permute",
"Pipeline",
"RMSNormalization",
"RNN",
"RandAugment",
"RandomBrightness",
"RandomColorDegeneration",
"RandomColorJitter",
"RandomContrast",
"RandomCrop",
"RandomElasticTransform",
"RandomErasing",
"RandomFlip",
"RandomGaussianBlur",
"RandomGrayscale",
"RandomHue",
"RandomInvert",
"RandomPerspective",
"RandomPosterization",
"RandomRotation",
"RandomSaturation",
"RandomSharpness",
"RandomShear",
"RandomTranslation",
"RandomZoom",
"ReLU",
"RepeatVector",
"Rescaling",
"Reshape",
"Resizing",
"ReversibleEmbedding",
"STFTSpectrogram",
"SeparableConv1D",
"SeparableConv2D",
"SeparableConvolution1D",
"SeparableConvolution2D",
"Sequential",
"SimpleRNN",
"SimpleRNNCell",
"Softmax",
"Solarization",
"SpatialDropout1D",
"SpatialDropout2D",
"SpatialDropout3D",
"SpectralNormalization",
"StackedRNNCells",
"StringLookup",
"Subtract",
"TFSMLayer",
"TextVectorization",
"TimeDistributed",
"TorchModuleWrapper",
"UnitNormalization",
"UpSampling1D",
"UpSampling2D",
"UpSampling3D",
"Wrapper",
"ZeroPadding1D",
"ZeroPadding2D",
"ZeroPadding3D",
}
)
153 changes: 6 additions & 147 deletions modelaudit/detectors/suspicious_symbols.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@

from typing import Any

from modelaudit.config.generated_keras_layers import GENERATED_KNOWN_SAFE_KERAS_LAYER_CLASSES

from ..config.explanations import DANGEROUS_OPCODES as _EXPLAIN_OPCODES

# OS module aliases that provide system access similar to the 'os' module
Expand Down Expand Up @@ -669,153 +671,10 @@
# without custom code execution (Sequential, Functional, Model)
KNOWN_SAFE_MODEL_CLASSES: set[str] = {"Sequential", "Functional", "Model"}

# Known safe Keras layer class names (standard built-in layers).
# Any layer class_name NOT in this set or SUSPICIOUS_LAYER_TYPES is treated as
# a custom/unknown layer that warrants attention.
KNOWN_SAFE_KERAS_LAYER_CLASSES: frozenset[str] = frozenset(
{
# Input
"InputLayer",
"Input",
# Core
"Dense",
"Activation",
"Embedding",
"Masking",
"Flatten",
"Reshape",
"Permute",
"RepeatVector",
"Identity",
"EinsumDense",
# Activations (added)
"ReLU",
"Softmax",
"LeakyReLU",
"PReLU",
"ELU",
# Convolutional
"Conv1D",
"Conv2D",
"Conv3D",
"SeparableConv1D",
"SeparableConv2D",
"DepthwiseConv1D",
"DepthwiseConv2D",
"Conv1DTranspose",
"Conv2DTranspose",
"Conv3DTranspose",
# Pooling
"MaxPooling1D",
"MaxPooling2D",
"MaxPooling3D",
"AveragePooling1D",
"AveragePooling2D",
"AveragePooling3D",
"GlobalMaxPooling1D",
"GlobalMaxPooling2D",
"GlobalMaxPooling3D",
"GlobalAveragePooling1D",
"GlobalAveragePooling2D",
"GlobalAveragePooling3D",
"MaxPool1D",
"MaxPool2D",
"MaxPool3D",
"AvgPool1D",
"AvgPool2D",
"AvgPool3D",
"GlobalMaxPool1D",
"GlobalMaxPool2D",
"GlobalMaxPool3D",
"GlobalAvgPool1D",
"GlobalAvgPool2D",
"GlobalAvgPool3D",
# RNN
"SimpleRNN",
"LSTM",
"GRU",
"ConvLSTM1D",
"ConvLSTM2D",
"ConvLSTM3D",
"SimpleRNNCell",
"LSTMCell",
"GRUCell",
"StackedRNNCells",
"Bidirectional",
"TimeDistributed",
"RNN",
# Normalization
"BatchNormalization",
"LayerNormalization",
"GroupNormalization",
"UnitNormalization",
"SpectralNormalization",
# Regularization
"Dropout",
"SpatialDropout1D",
"SpatialDropout2D",
"SpatialDropout3D",
"GaussianNoise",
"GaussianDropout",
"AlphaDropout",
"ActivityRegularization",
# Attention
"MultiHeadAttention",
"Attention",
"AdditiveAttention",
# Merging
"Add",
"Subtract",
"Multiply",
"Average",
"Maximum",
"Minimum",
"Concatenate",
"Dot",
# Padding/Cropping
"ZeroPadding1D",
"ZeroPadding2D",
"ZeroPadding3D",
"Cropping1D",
"Cropping2D",
"Cropping3D",
# Upsampling
"UpSampling1D",
"UpSampling2D",
"UpSampling3D",
# Preprocessing
"Rescaling",
"Resizing",
"CenterCrop",
"RandomFlip",
"RandomRotation",
"RandomZoom",
"RandomCrop",
"RandomTranslation",
"RandomContrast",
"RandomBrightness",
"RandomHeight",
"RandomWidth",
"Normalization",
"Discretization",
"CategoryEncoding",
"Hashing",
"HashedCrossing",
"StringLookup",
"IntegerLookup",
"TextVectorization",
# TF-specific
"TFSMLayer",
# Wrapper
"Wrapper",
# Model classes (nested models in configs)
"Sequential",
"Functional",
"Model",
# Keras DType
"DTypePolicy",
}
)
# Known safe Keras layer class names derived from Keras public `keras.layers.*`
# exports. Refresh the generated inventory with
# `scripts/generate_keras_layer_inventory.py` when Keras adds new public layers.
KNOWN_SAFE_KERAS_LAYER_CLASSES: frozenset[str] = GENERATED_KNOWN_SAFE_KERAS_LAYER_CLASSES

# Known standard Keras loss function names (string identifiers and class names).
# Used to detect custom/unknown loss functions in training_config.
Expand Down
Loading
Loading