Apprendimento profondo con Keras - Apprendimento profondo
Come detto nell'introduzione, il deep learning è un processo di addestramento di una rete neurale artificiale con un'enorme quantità di dati. Una volta addestrata, la rete sarà in grado di fornirci le previsioni su dati invisibili. Prima di andare oltre nello spiegare cos'è l'apprendimento profondo, esaminiamo rapidamente alcuni termini utilizzati nell'addestramento di una rete neurale.
Reti neurali
L'idea di rete neurale artificiale è stata derivata dalle reti neurali nel nostro cervello. Una tipica rete neurale è costituita da tre livelli: input, output e nascosto, come mostrato nell'immagine sottostante.
Questo è anche chiamato a shallowrete neurale, poiché contiene solo uno strato nascosto. Aggiungere più livelli nascosti nell'architettura sopra per creare un'architettura più complessa.
Reti profonde
Il diagramma seguente mostra una rete profonda composta da quattro livelli nascosti, un livello di input e un livello di output.
Man mano che il numero di livelli nascosti viene aggiunto alla rete, la sua formazione diventa più complessa in termini di risorse richieste e il tempo necessario per addestrare completamente la rete.
Formazione in rete
Dopo aver definito l'architettura di rete, addestrarla per eseguire determinati tipi di previsioni. La formazione di una rete è un processo per trovare i pesi corretti per ogni collegamento nella rete. Durante l'addestramento, i dati fluiscono dai livelli di input a quelli di output attraverso vari livelli nascosti. Poiché i dati si muovono sempre in una direzione dall'input all'output, chiamiamo questa rete come Feed-forward Network e chiamiamo la propagazione dei dati come Forward Propagation.
Funzione di attivazione
Ad ogni livello, calcoliamo la somma ponderata degli input e la inseriamo in una funzione di attivazione. La funzione di attivazione porta la non linearità alla rete. È semplicemente una funzione matematica che discretizza l'output. Alcune delle funzioni di attivazione più comunemente utilizzate sono sigmoide, iperbolica, tangente (tanh), ReLU e Softmax.
Backpropagation
Backpropagation è un algoritmo per l'apprendimento supervisionato. In Backpropagation, gli errori si propagano all'indietro dall'output al livello di input. Data una funzione di errore, calcoliamo il gradiente della funzione di errore rispetto ai pesi assegnati ad ogni connessione. Il calcolo del gradiente procede a ritroso attraverso la rete. Il gradiente del primo strato di pesi viene calcolato per primo e il gradiente del primo strato di pesi viene calcolato per ultimo.
Ad ogni strato, i calcoli parziali del gradiente vengono riutilizzati nel calcolo del gradiente per lo strato precedente. Questo si chiama Gradient Descent.
In questo tutorial basato sul progetto definirai una rete neurale profonda feed-forward e la addestrerai con tecniche di backpropagation e di discesa del gradiente. Fortunatamente, Keras ci fornisce tutte le API di alto livello per la definizione dell'architettura di rete e l'addestramento utilizzando la discesa del gradiente. Successivamente, imparerai come farlo in Keras.
Sistema di riconoscimento delle cifre scritte a mano
In questo mini progetto, applicherai le tecniche descritte in precedenza. Creerai una rete neurale di apprendimento profondo che verrà addestrata per il riconoscimento delle cifre scritte a mano. In qualsiasi progetto di machine learning, la prima sfida è raccogliere i dati. In particolare, per le reti di apprendimento profondo, hai bisogno di dati enormi. Fortunatamente, per il problema che stiamo cercando di risolvere, qualcuno ha già creato un set di dati per l'addestramento. Questo si chiama mnist, che è disponibile come parte delle librerie di Keras. Il set di dati è costituito da diverse immagini di 28x28 pixel di cifre scritte a mano. Addestrerai il tuo modello sulla maggior parte di questo set di dati e il resto dei dati verrà utilizzato per convalidare il tuo modello addestrato.
descrizione del progetto
Il mnistil set di dati è costituito da 70000 immagini di cifre scritte a mano. Alcune immagini di esempio sono riprodotte qui per riferimento
Ogni immagine ha una dimensione di 28 x 28 pixel per un totale di 768 pixel di vari livelli di scala di grigi. La maggior parte dei pixel tende verso l'ombra del nero mentre solo pochi di essi sono verso il bianco. Metteremo la distribuzione di questi pixel in un array o in un vettore. Ad esempio, la distribuzione dei pixel per un'immagine tipica delle cifre 4 e 5 è mostrata nella figura seguente.
Ogni immagine ha una dimensione di 28 x 28 pixel per un totale di 768 pixel di vari livelli di scala di grigi. La maggior parte dei pixel tende verso l'ombra del nero mentre solo pochi di essi sono verso il bianco. Metteremo la distribuzione di questi pixel in un array o in un vettore. Ad esempio, la distribuzione dei pixel per un'immagine tipica delle cifre 4 e 5 è mostrata nella figura seguente.
Chiaramente si vede che la distribuzione dei pixel (soprattutto quelli tendenti al bianco) è diversa, questo contraddistingue le cifre che rappresentano. Forniremo questa distribuzione di 784 pixel alla nostra rete come input. L'output della rete sarà composto da 10 categorie che rappresentano una cifra compresa tra 0 e 9.
La nostra rete sarà composta da 4 livelli: uno di input, uno di output e due nascosti. Ogni livello nascosto conterrà 512 nodi. Ogni livello è completamente connesso al livello successivo. Quando addestriamo la rete, calcoleremo i pesi per ciascuna connessione. Addestriamo la rete applicando la retropropagazione e la discesa del gradiente di cui abbiamo discusso in precedenza.