Una exploración de datos de estado-modelo en la detección de anomalías |  de Sara Nóbrega |  abril de 2024

Los datos

Datos de píxeles MNIST

El primer conjunto de datos empleado aquí son los datos de píxeles MNIST habituales, compuestos por números escritos a mano. Aquí, el fondo es negro y los dígitos son blancos.

Figura 1: Datos de píxeles MNIST | Imagen del autor

Anómalo Datos de píxeles MNIST

Para probar el nuevo procedimiento y compararlo con el habitual, creé cuatro tipos simples de datos anómalos.

El objetivo era probar las capacidades de detección de cada método en un pequeño espectro de variaciones de ruido, intensificadas gradualmente de un tipo de anomalía a otro.

La tasa de ruido aumenta del primero al cuarto tipo de datos anómalos. Como puede ver en la figura siguiente, en el primer y segundo tipo de datos, el ruido ni siquiera es detectable a simple vista, mientras que en el tercer tipo ya se pueden detectar algunos píxeles blancos.

Figura 2: Cuatro tipos de datos anómalos | Imagen del autor

Datos de estado del modelo

Si bien los datos de píxeles MNIST, con sus dígitos escritos a mano sobre un fondo austero, proporcionan una base clásica para la detección de anomalías, estamos intentando algo más. Es un pequeño salto que nos lleva directamente al núcleo de la RNA entrenada para ver qué están haciendo las neuronas. Esto podría brindarnos un ángulo completamente nuevo para detectar anomalías.

Como se mencionó, los datos de estado de este modelo están compuestos por el estado de las neuronas en una ANN cuando se entrenan con datos MNIST. Como tal, para generar estos datos, comenzamos entrenando una RNA simple con datos de píxeles MNIST, tanto con datos normales como anómalos (los anómalos están compuestos por los datos ruidosos mostrados anteriormente en la Figura 2).

Luego realizamos lo habitual: dividimos los datos en entrenamiento y prueba, y luego ajustamos el modelo ANN:

model.fit(X_train,Y_cat_train,epochs=8, validation_data=(X_test, y_cat_test))

Después de eso, queremos recuperar los nombres de las capas en modelo y almacenarlos en una lista:

list(map(lambda x: x.name, model.layers))

Finalmente, creamos un nuevo modelo que toma la misma entrada que el original. modelo pero produce una salida de una capa específica llamada “densa”:

intermediate_layer_model=Model(inputs=model.input, outputs=model.get_layer("dense").output)

Esto es útil para extraer información de capas intermedias de una red neuronal.

Echemos un vistazo a esto datos de estado del modelo:

model_state_data_layer1=pd.read_csv("first_layer_dense.csv",header=None)
model_state_data_layer2=pd.read_csv("second_layer_dense.csv",header=None)

model_state_data_layer1.head(4)

Figura 3: Instantánea de los datos del estado del modelo (primera capa). | Imagen del autor

Los datos del estado del modelo de la primera capa neuronal están compuestos por 32 columnas y 4 filas.

Con tan solo unas pocas líneas de código, somos capaces de extraer datos de las capas intermedias de una red neuronal.

Para estudiar la eficacia del nuevo método, utilizaré datos tanto del primera y segunda capas de la red neuronal.