# Rete neurale convoluzionale

Nell'apprendimento automatico, una rete neurale convoluzionale (CNN o ConvNet dall'inglese convolutional neural network) è un tipo di rete neurale artificiale feed-forward in cui il pattern di connettività tra i neuroni è ispirato dall'organizzazione della corteccia visiva animale, i cui neuroni individuali sono disposti in maniera tale da rispondere alle regioni di sovrapposizione che tassellano il campo visivo. Le reti convoluzionali sono ispirate da processi biologici e sono variazioni di percettroni multistrato progettate per usare al minimo la pre-elaborazione. Hanno diverse applicazioni nel riconoscimento di immagini e video, nei sistemi di raccomandazione, nell'elaborazione del linguaggio naturale e, recentemente, in bioinformatica.

## Storia

Il design delle RNC segue il processing della visione negli organismi viventi.

### Campi recettivi

Il lavoro di Hubel e Wiesel negli anni '50 e '60, mostrò come la corteccia visiva di gatti e scimmie contenesse neuroni che individualmente rispondono a piccole regioni del campo visivo. Supposto che gli occhi non si muovano, la regione del campo visivo entro cui lo stimolo influenzi l'innesco di un singolo neurone è noto come il suo campo recettivo. Cellule adiacenti hanno campi recettivi simili e sovrapposti. La dimensione del campo recettivo e la localizzazione variano sistematicamente attraverso la corteccia per formare una mappa completa del campo visivo. La corteccia in ogni emisfero rappresenta il campo visivo del lato opposto.
Il loro paper del 1968 identificò due tipi di cellule visive nel cervello:
* cellule semplici, il cui output è massimizzato dal fatto di avere i bordi rettilinei orientati in un modo particolare entro il loro campo ricettivo
* cellule complesse, che hanno campi ricettivi più ampi, il cui output è insensibile all'esatta posizione dei bordi nel campo.

### Neocognitron

Il neocognitron fu introdotto nel 1980. Il neocognitron non richiede unità localizzate in posizioni multiple di avere gli stessi pesi addestrabili. Questa idea apparve nel 1986 nella versione libraria dell'originale paper sulla backpropagation (Figure 14). Neocognitrons furono sviluppati nel 1988 per i segnali temporali. Il loro design fu migliorato nel 1998, generalizzato nel 2003 e semplificato nello stesso anno.

#### LeNet-5

LeNet-5, una pionieristica rete convoluzionale a 7 livelli progettata da LeCun e altri nel 1998 che classifica cifre, fu applicata da svariate banche per riconoscere dei numeri scritti a mano sugli assegni, digitalizzati in immagini di 32×32 pixel. L'abilità di processare immagini di risoluzione più alta richiede livelli convoluzionali più grandi e un maggior numero di essi, così questa tecnica è limitata dalla disponibilità di risorse computazionali.

### Shift-invariant neural network

Similarmente, una shift invariant neural network (rete invariante alla traslazione) fu proposta per il riconoscimento dei caratteri nel 1988. L'architettura e l'algoritmo di addestramento furono modificati nel 1991, applicandoli nell'elaborazione delle immagini mediche e nel rilevamento automatico del cancro al seno nelle mammografie.
Un differente design basato sulla convoluzione fu proposto nel 1988 per l'applicazione alla decomposizione di segnali provenienti da elettromiografie, monodimensionali e convoluti tramite de-convoluzione. Questo design fu modificato nel 1989 in altri design sempre basati sulla convoluzione.

### Neural abstraction pyramid

L'architettura feed-forward delle reti neurali convoluzionali fu esteso nella piramide di astrazione neurale da connessioni laterali di feedback. La risultante rete neurale convoluzionale ricorrente permette l'incorporazione flessibile di informazioni contestuali per risolvere iterativamente ambiguità locali. In contrasto con i modelli precedenti, output sono generali in formato immagine alla risoluzione massima.

### Implementazioni in GPU

A seguito dell'articolo del 2005 che stabilì il lavoro della GPGPU per l'apprendimento automatico, svariate pubblicazioni descrissero modi più efficienti per addestrare delle reti neurali convoluzionali usando la GPU. Nel 2011, esse vennero rifinite e implementate su una GPU, con impressionanti risultati. Nel 2012, Ciresan e altri incrementarono significativamente le migliori prestazioni in letteratura riguardo a multiple basi di dati d'immagini, compresi il MNIST, il NORB, l'HWDB1.0 (caratteri cinesi), il CIFAR10 (insieme di 60 000 32×32 immagini RGB etichettate) e l'ImageNet.

## Costruzione dei blocchi

* Strato Convoluzionale
* Strato di Pooling
* Strato ReLu
* Strato completamente connesso
* Strato di Loss (Perdita)

## Applicazioni

Le CNN sono uno strumento fondamentale nel campo del deep learning. In particolare sono adatte per il riconoscimento di immagini. Si può usare l'architettura ConvNet, per addestrare una rete, e usarla successivamente per ottenere una label categorica o numerica. È possibile inoltre estrarre features da una rete addestrata precedentemente, e usare le stesse per addestrare un classificatore lineare. Inoltre, è possibile effettuare il transfer learning, che consiste nell'effettuare il retrain dell'ultimo strato collegato di una ConvNet già esistente su nuovi dati.
Riguardo all'addestramento dei modelli partendo da video, le CNN possono essere utilizzate anche per identificare l'emozione umana a partire dai movimenti. In questo caso, si tratta di elaborare sequenze di frame video anziché singole immagini. Le CNN possono essere adattate per lavorare con dati di tipo sequenziale, come sequenze di immagini, applicando l'operazione di convoluzione e pooling su ciascun frame e utilizzando le informazioni spaziali e temporali per identificare l'emozione.
Si può effettuare il train di una CNN sia su CPU, singola GPU, GPU multiple in parallelo.

## Librerie di programmazione

* Caffe (replacement of Decaf)
* Microsoft Cognitive Toolkit
* Torch (www.torch.ch):
* neon: The fastest
* OverFeat:
* Cuda-convnet:
* MatConvnet
* Theano
* Deeplearning4j: Deep learning in Java and Scala su GPU-enabled Spark
* deeplearning-hs: Deep learning in Haskell, supporta computazioni con CUDA.
* TensorFlow
* Veles
* Keras
* OpenVX