Questo articolo è stato pubblicato nell'ambito del Blogathon sulla scienza dei dati
Ciao ragazzi! In questo blog, Discuterò tutto sulla classificazione delle immagini.
Negli ultimi anni, Deep Learning ha dimostrato di essere uno strumento molto potente grazie alla sua capacità di gestire grandi quantità di dati. L'uso di strati nascosti supera le tecniche tradizionali, soprattutto per il riconoscimento dei modelli. Una delle reti neurali profonde più popolari sono le reti neurali convoluzionali (CNN).
Una rete neurale convoluzionale (CNN) è una specie di Artificiale neuronale rosso (ANN) utilizzato nel riconoscimento e nell'elaborazione delle immagini, che è appositamente progettato per elaborare i dati (pixel).
Fonte immagine: Google.com
Prima di andare avanti, dobbiamo capire cos'è la rete neurale. Andiamo…
neuronale rosso:
Una rete neurale è costituita da diversi nodi interconnessi chiamati “neuroni”. I neuroni sono organizzati in livello di input, livello nascosto e livello di output. Il livello di input corrisponde ai nostri predittori / caratteristiche e il livello di output alle nostre variabili di risposta.
Fonte immagine: Google.com
Perceptron multistrato (MLP):
La rete neurale con un livello di input, uno o più livelli nascosti e viene chiamato un livello di output perceptron multistrato (MLP). MLP è inventato da Frank Rosenblatt Nell'anno di 1957. MLP mostrato di seguito ha 5 nodi di input, 5 nodi nascosti con due livelli nascosti e un nodo di uscita
Fonte immagine: Google.com
Come funziona questa rete neurale?
– I neuroni dello strato di input ricevono informazioni in entrata dai dati che elaborano e distribuiscono al strati nascosti.
– quell'informazione, allo stesso tempo, viene elaborato da livelli nascosti e passato all'output. neuroni.
– Le informazioni da questa rete neurale artificiale (ANN) viene elaborato in termini di a funzione sveglia. Questa funzione imita effettivamente i neuroni nel cervello.
– Ogni neurone contiene un valore di funzioni di attivazione e un valore di soglia.
– Il valore di soglia è il valore minimo che l'ingresso deve avere per attivarsi.
– Il compito del neurone è quello di eseguire una somma pesata di tutti i segnali in ingresso e applicare la funzione di attivazione sulla somma prima di passarla allo strato successivo. (nascosto o esci).
Capiamo qual è la somma ponderata.
Diciamo che abbiamo valori 𝑎1, 2, 3, 𝑎4 per input e pesi come 𝑤1, 2, 3, 4 come input per uno dei neuroni dello strato nascosto, diciamo, quindi la somma ponderata è rappresentata come
𝑆𝑗 = σ 𝑖 = 1to4 𝑤𝑖 * 𝑎𝑖 + ?
dove: bias dovuto al nodo
Fonte immagine: Google.com
Quali sono le funzioni di attivazione?
Queste funzioni sono necessarie per introdurre una non linearità nella rete. La funzione trigger viene applicata e quell'output viene passato al livello successivo.
* Funzioni possibili *
• Sigmoide: la funzione sigmoide è differenziabile. Produce un output tra 0 e 1.
• Tangente iperbolica: Anche la tangente iperbolica è differenziabile. Questo produce un output tra -1 e 1.
• ReLU: ReLU è la funzione più popolare. ReLU è ampiamente utilizzato nel deep learning.
• Softmax: la funzione softmax viene utilizzata per problemi di classificazione di più classi. È una generalizzazione della funzione sigmoide. Produce anche un output tra 0 e 1
Ora, andiamo con il nostro tema CNN …
CNN:
Ora immagina che ci sia la foto di un uccello, e vuoi identificarlo se è davvero un uccello o qualcos'altro. La prima cosa che devi fare è alimentare i pixel dell'immagine sotto forma di array al livello di input della rete neurale (Le reti MLP vengono utilizzate per classificare queste cose). I livelli nascosti trasportano l'estrazione delle caratteristiche eseguendo vari calcoli e operazioni. Ci sono diversi livelli nascosti come la convoluzione, il ReLU e il livello di raggruppamento che esegue l'estrazione delle caratteristiche dall'immagine. Quindi, Finalmente, c'è un livello completamente connesso che puoi vedere che identifica l'oggetto esatto nell'immagine. Puoi capire molto facilmente dalla figura seguente:
Fonte immagine: Google.com
convoluzione:-
L'operazione di convoluzione prevede operazioni aritmetiche matriciali e ogni immagine è rappresentata come un array di valori (pixel).
Capiamo l'esempio:
a = [2,5,8,4,7,9]
b = [1,2,3]
Nell'operazione di convoluzione, le matrici vengono moltiplicate una per una in termini di elementi, e il prodotto viene raggruppato o sommato per creare una nuova matrice che rappresenta un * B.
I primi tre elementi dell'array un ora moltiplica per gli elementi dell'array B. Il prodotto viene aggiunto per ottenere il risultato e viene immagazzinato in una nuova matrice di un * B.
Questo processo rimane continuo fino al completamento dell'operazione..
Fonte immagine: Google.com
Raggruppamento:
Dopo la convoluzione, c'è un'altra operazione chiamata raggruppamento. Quindi, Nella catena, convoluzione e raggruppamento vengono applicati in sequenza sui dati al fine di estrarre alcune caratteristiche dai dati. Dopo livelli cluster sequenziali e convoluzionali, i dati sono appiattiti
in una rete neurale di feedback che è anche chiamata percettrone multistrato.
Fonte immagine: Google.com
Finora, abbiamo visto concetti che sono importanti per il nostro modello di costruzione della CNN.
Ora andremo avanti per vedere un caso di studio della CNN.
1) Qui importeremo le librerie necessarie necessarie per eseguire le attività CNN.
import NumPy as np
%matplotlib inline
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import TensorFlow as tf
tf.compat.v1.set_random_seed(2019)
2) Qui richiediamo il seguente codice per formare il modello CNN
modello = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(16,(3,3),attivazione = "riprendere" , input_forma = (180,180,3)) , tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(32,(3,3),attivazione = "riprendere") , tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(64,(3,3),attivazione = "riprendere") , tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(128,(3,3),attivazione = "riprendere"), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Appiattire(), tf.strati.duri.Densi(550,attivazione="riprendere"), #Adding the Hidden layer tf.keras.layers.Dropout(0.1,seme = 2019), tf.strati.duri.Densi(400,attivazione ="riprendere"), tf.keras.layers.Dropout(0.3,seme = 2019), tf.strati.duri.Densi(300,attivazione="riprendere"), tf.keras.layers.Dropout(0.4,seme = 2019), tf.strati.duri.Densi(200,attivazione ="riprendere"), tf.keras.layers.Dropout(0.2,seme = 2019), tf.strati.duri.Densi(5,attivazione = "softmax") #Aggiunta del livello di output ])
Un'immagine contorta potrebbe essere troppo grande e, così, si restringe senza perdere feature o serie, quindi il raggruppamento è fatto.
Qui, Creare una rete neurale significa inizializzare la rete utilizzando il modello sequenziale Keras.
Appiattire (): l'appiattimento trasforma una matrice bidimensionale di feature in un vettore di feature.
3) Ora diamo un'occhiata a un riepilogo del modello della CNN
modello.riepilogo()
Stamperai il seguente output
Modello: "sequenziale" _________________________________________________________________ Strato (genere) Parametro forma di output # ================================================================= conv2d (Conv2D) (Nessuno, 178, 178, 16) 448 _________________________________________________________________ max_pooling2d (MaxPooling2D) (Nessuno, 89, 89, 16) 0 _________________________________________________________________ conv2d_1 (Conv2D) (Nessuno, 87, 87, 32) 4640 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (Nessuno, 43, 43, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (Nessuno, 41, 41, 64) 18496 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (Nessuno, 20, 20, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (Nessuno, 18, 18, 128) 73856 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (Nessuno, 9, 9, 128) 0 _________________________________________________________________ flatten (Appiattire) (Nessuno, 10368) 0 _________________________________________________________________ dense (Denso) (Nessuno, 550) 5702950 _________________________________________________________________ dropout (Ritirarsi) (Nessuno, 550) 0 _________________________________________________________________ dense_1 (Denso) (Nessuno, 400) 220400 _________________________________________________________________ dropout_1 (Ritirarsi) (Nessuno, 400) 0 _________________________________________________________________ densa_2 (Denso) (Nessuno, 300) 120300 _________________________________________________________________ dropout_2 (Ritirarsi) (Nessuno, 300) 0 _________________________________________________________________ densa_3 (Denso) (Nessuno, 200) 60200 _________________________________________________________________ dropout_3 (Ritirarsi) (Nessuno, 200) 0 _________________________________________________________________ dense_4 (Denso) (Nessuno, 5) 1005 ================================================== =============== Parametri totali: 6,202,295 Parametri addestrabili: 6,202,295 Parametri non addestrabili: 0
4) Así que ahora estamos obligados a especificar optimizadores.
da tensorflow.keras.optimizers importare RMSprop,SGD,Adam
adam=Adam(lr=0,001)
modello.compila(ottimizzatore="Adamo", perdita="categorical_crossentropy", metriche = ['acc'])
L'ottimizzatore viene utilizzato per ridurre il costo calcolato per entropia incrociata
La funzione di perdita viene utilizzata per calcolare l'errore.
Il termine metriche viene utilizzato per rappresentare l'efficienza del modello.
5) In questo passaggio, vedremo come configurare la directory dei dati e generare i dati dell'immagine.
bs=30 #Setting batch size train_dir = "D:/Data Science/Set di dati di immagini/FastFood/treno/" #Setting training directory validation_dir = "D:/Data Science/Set di dati di immagini/FastFood/test/" #Setting testing directory from tensorflow.keras.preprocessing.image import ImageDataGenerator # Tutte le immagini verranno ridimensionate da 1./255. train_datagen = ImageDataGenerator( ridimensionamento = 1.0/255. ) test_datagen = ImageDataGenerator( ridimensionamento = 1.0/255. ) # Immagini di addestramento del flusso in lotti di 20 using train_datagen generator #Flow_from_directory function lets the classifier directly identify the labels from the name of the directories the image lies in train_generator=train_datagen.flow_from_directory(train_dir,batch_size=bs,class_mode="categorico",target_size=(180,180)) # Immagini di convalida del flusso in batch di 20 using test_datagen generator validation_generator = test_datagen.flow_from_directory(validation_dir, batch_size=bs, class_mode="categorico", target_size=(180,180))
La salida será:
Fondare 1465 immagini appartenenti a 5 Classi. Fondare 893 immagini appartenenti a 5 Classi.
6) Paso final del modelo de ajuste.
storia = modello.fit(train_generator, validation_data=validation_generator, steps_per_epoch=150 // B, epoche=30, validation_steps=50 // B, verboso=2)
La salida será:
Epoca 1/30 5/5 - 4S - perdita: 0.8625 - acc: 0.6933 - val_loss: 1.1741 - val_acc: 0.5000 Epoca 2/30 5/5 - 3S - perdita: 0.7539 - acc: 0.7467 - val_loss: 1.2036 - val_acc: 0.5333 Epoca 3/30 5/5 - 3S - perdita: 0.7829 - acc: 0.7400 - val_loss: 1.2483 - val_acc: 0.5667 Epoca 4/30 5/5 - 3S - perdita: 0.6823 - acc: 0.7867 - val_loss: 1.3290 - val_acc: 0.4333 Epoca 5/30 5/5 - 3S - perdita: 0.6892 - acc: 0.7800 - val_loss: 1.6482 - val_acc: 0.4333 Epoca 6/30 5/5 - 3S - perdita: 0.7903 - acc: 0.7467 - val_loss: 1.0440 - val_acc: 0.6333 Epoca 7/30 5/5 - 3S - perdita: 0.5731 - acc: 0.8267 - val_loss: 1.5226 - val_acc: 0.5000 Epoca 8/30 5/5 - 3S - perdita: 0.5949 - acc: 0.8333 - val_loss: 0.9984 - val_acc: 0.6667 Epoca 9/30 5/5 - 3S - perdita: 0.6162 - acc: 0.8069 - val_loss: 1.1490 - val_acc: 0.5667 Epoca 10/30 5/5 - 3S - perdita: 0.7509 - acc: 0.7600 - val_loss: 1.3168 - val_acc: 0.5000 Epoca 11/30 5/5 - 4S - perdita: 0.6180 - acc: 0.7862 - val_loss: 1.1918 - val_acc: 0.7000 Epoca 12/30 5/5 - 3S - perdita: 0.4936 - acc: 0.8467 - val_loss: 1.0488 - val_acc: 0.6333 Epoca 13/30 5/5 - 3S - perdita: 0.4290 - acc: 0.8400 - val_loss: 0.9400 - val_acc: 0.6667 Epoca 14/30 5/5 - 3S - perdita: 0.4205 - acc: 0.8533 - val_loss: 1.0716 - val_acc: 0.7000 Epoca 15/30 5/5 - 4S - perdita: 0.5750 - acc: 0.8067 - val_loss: 1.2055 - val_acc: 0.6000 Epoca 16/30 5/5 - 4S - perdita: 0.4080 - acc: 0.8533 - val_loss: 1.5014 - val_acc: 0.6667 Epoca 17/30 5/5 - 3S - perdita: 0.3686 - acc: 0.8467 - val_loss: 1.0441 - val_acc: 0.5667 Epoca 18/30 5/5 - 3S - perdita: 0.5474 - acc: 0.8067 - val_loss: 0.9662 - val_acc: 0.7333 Epoca 19/30 5/5 - 3S - perdita: 0.5646 - acc: 0.8138 - val_loss: 0.9151 - val_acc: 0.7000 Epoca 20/30 5/5 - 4S - perdita: 0.3579 - acc: 0.8800 - val_loss: 1.4184 - val_acc: 0.5667 Epoca 21/30 5/5 - 3S - perdita: 0.3714 - acc: 0.8800 - val_loss: 2.0762 - val_acc: 0.6333 Epoca 22/30 5/5 - 3S - perdita: 0.3654 - acc: 0.8933 - val_loss: 1.8273 - val_acc: 0.5667 Epoca 23/30 5/5 - 3S - perdita: 0.3845 - acc: 0.8933 - val_loss: 1.0199 - val_acc: 0.7333 Epoca 24/30 5/5 - 3S - perdita: 0.3356 - acc: 0.9000 - val_loss: 0.5168 - val_acc: 0.8333 Epoca 25/30 5/5 - 3S - perdita: 0.3612 - acc: 0.8667 - val_loss: 1.7924 - val_acc: 0.5667 Epoca 26/30 5/5 - 3S - perdita: 0.3075 - acc: 0.8867 - val_loss: 1.0720 - val_acc: 0.6667 Epoca 27/30 5/5 - 3S - perdita: 0.2820 - acc: 0.9400 - val_loss: 2.2798 - val_acc: 0.5667 Epoca 28/30 5/5 - 3S - perdita: 0.3606 - acc: 0.8621 - val_loss: 1.2423 - val_acc: 0.8000 Epoca 29/30 5/5 - 3S - perdita: 0.2630 - acc: 0.9000 - val_loss: 1.4235 - val_acc: 0.6333 Epoca 30/30 5/5 - 3S - perdita: 0.3790 - acc: 0.9000 - val_loss: 0.6173 - val_acc: 0.8000
La función anterior entrena la red neuronal utilizando el conjunto de entrenamiento y evalúa su rendimiento en el conjunto de prueba. Le funzioni restituiscono due metriche per ogni epoca 'acc’ y 'val_acc’ quali sono la precisione delle previsioni ottenute nel training set e la precisione raggiunta nel test set, rispettivamente.
conclusione:
Perciò, vediamo che è stato accolto con sufficiente precisione. tuttavia, chiunque può eseguire questo modello aumentando il numero di epoche o qualsiasi altro parametro.
Spero che il mio articolo ti sia piaciuto. condividi con i tuoi amici, colleghi.
Il supporto mostrato in questo articolo non è di proprietà di DataPeaker e viene utilizzato a discrezione dell'autore.