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