I dati
Dati pixel MNIST
Il primo set di dati utilizzato qui sono i soliti dati pixel MNIST, costituiti da numeri scritti a mano. Qui lo sfondo è nero e le cifre sono bianche.
Anomalo Dati pixel MNIST
Per testare la nuova procedura e confrontarla con quella abituale, ho creato quattro tipi semplici di dati anomali.
L'obiettivo era testare le capacità di rilevamento di ciascun metodo su un piccolo spettro di variazioni di rumore, intensificate in modo incrementale da un tipo di anomalia a quello successivo.
Il tasso di rumore aumenta dal primo al quarto tipo di dato anomalo. Come potete vedere nella figura sotto, nella prima e nella seconda tipologia di dati il rumore non è rilevabile nemmeno ad occhio nudo, mentre nella terza tipologia si possono già individuare alcuni pixel bianchi.
Dati sullo stato del modello
Mentre i dati pixel MNIST, con le sue cifre scritte a mano su uno sfondo rigido, forniscono una base classica per il rilevamento di anomalie, stiamo provando qualcos'altro. È un piccolo salto, che ci porta direttamente al centro della ANN addestrata per vedere cosa stanno facendo i neuroni. Questo potrebbe darci una prospettiva completamente nuova sull’individuazione delle anomalie.
Come accennato, i dati sullo stato del modello sono costituiti da lo stato dei neuroni in una ANN quando addestrata con i dati MNIST. Pertanto, per generare questi dati, iniziamo con l'addestramento di una semplice ANN con dati pixel MNIST, sia con dati normali che anomali (gli anomali sono compresi dai dati rumorosi mostrati prima nella Figura 2).
Quindi eseguiamo la solita procedura: dividiamo i dati in training e testing, quindi adattiamo il modello ANN:
model.fit(X_train,Y_cat_train,epochs=8, validation_data=(X_test, y_cat_test))
Successivamente, vogliamo recuperare i nomi degli strati in modello e memorizzarli in un elenco:
list(map(lambda x: x.name, model.layers))
Infine, creiamo un nuovo modello che accetta lo stesso input dell'originale modello ma produce output da uno strato specifico chiamato “denso”:
intermediate_layer_model=Model(inputs=model.input, outputs=model.get_layer("dense").output)
Ciò è utile per estrarre informazioni dagli strati intermedi di una rete neurale.
Diamo un'occhiata a questo dati sullo stato del modello:
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)
I dati dello stato del modello del primo strato neurale sono costituiti da 32 colonne e 4 righe.
Con poche righe di codice siamo in grado di estrarre dati dagli strati intermedi di una rete neurale.
Per studiare l'efficacia del nuovo metodo, utilizzerò i dati di entrambi primo e secondo strato della rete neurale.
Fonte: towardsdatascience.com