DeepDream: differenze tra le versioni

Da Wiki AI.
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 7: Riga 7:
}}
}}


Nel 2015, [https://znah.net Alexander Mordvintsev], sviluppatore di Google, ha pubblicato un blog post contenente la descrizione di quello che rimarrà sicuramente uno dei più interessanti e singolari esperimenti fatti con le reti neurali. Alexander è anche un'artista interattivo, e quindi ha un particolare sensibilità nel provare a utilizzare algoritmi e modelli in un modo non convenzionale.
Nel 2015, [https://znah.net Alexander Mordvintsev], sviluppatore di Google, ha pubblicato un blog post contenente la descrizione di quello che diventò uno dei più interessanti e singolari esperimenti fatti con le reti neurali. Essendo anche un un'artista interattivo, aveva un particolare sensibilità nell'utilizzare algoritmi e modelli in un modo non convenzionale e creativo.


Alexander fa esattamente il seguente tentativo. Presa una rete neurale convoluzionale per la classificazione di immagini, come [[Rete Neurale Residua (ResNet)|ResNet]], [[VGG16 (ConvNet)|VGG16]], o [[GoogLeNet]], il modello va a iterativamente modificare l'immagine di input in modo da '''massimizzare le attivazioni''' di uno o più strati della rete neurale, predeterminati.
Il ricercatore fa la seguente prova: fornisce un'immagine in input a una rete neurale convoluzionale pre-addestrata per la classificazione di immagini, come [[Rete Neurale Residua (ResNet)|ResNet]], [[VGG16 (ConvNet)|VGG16]], o [[GoogLeNet]], ma non vuole classificarla. In realtà vuole usarla per capire quali sono le caratteristiche che una rete convoluzionale "vede".
 
Alexander ipotizza che  quindi i risultati intermedi per modificare l'immagine di input in modo da massimizzare le attivazioni di uno o più strati della rete neurale, predeterminati. In questo modo il modello di classificazione viene effettivamente utilizzato come un "generatore".


Sono state viste tre implementazioni:
Sono state viste tre implementazioni:
Riga 15: Riga 17:
* [https://github.com/google/deepdream/tree/master?tab=readme-ov-file l'implementazione originale in Caffè]
* [https://github.com/google/deepdream/tree/master?tab=readme-ov-file l'implementazione originale in Caffè]
* [https://github.com/gordicaleksa/pytorch-deepdream/tree/master un'implementazione in Pytorch piuttosto recente e ben scritta]
* [https://github.com/gordicaleksa/pytorch-deepdream/tree/master un'implementazione in Pytorch piuttosto recente e ben scritta]
* https://www.tensorflow.org/tutorials/generative/deepdream
* [https://www.tensorflow.org/tutorials/generative/deepdream implementazione ufficiale in Tensorflow]


=== Il trattamento dei gradienti ===
=== Come funziona ===
[[File:VGG16.png|destra|senza_cornice|444x444px]]
[[File:VGG16.png|destra|senza_cornice|444x444px]]
La particolarità di questo metodo, come si diceva, consiste nell effetturare l'esatto contrario di quanto si fa normalmente durante l'addestramento di una rete neurale. Se durante l'addestramento della rete, infatti, si è utilizzata la [[discesa del gradiente]] per aggiornare i valori dei coefficienti degli strati della rete, minimizzando così il valore della [[Funzione Obiettivo (loss)|funzione di perdita]], il modello DeepDream prevede di calcolare i gradienti della perdita '''rispetto all'immagine''', e poi aggiungerli all'immagine: questo intensifica i pattern visti dalla rete in quei layer, e viene chiamato "'''gradient ascent"''' o ascesa del gradiente.
La particolarità di questo metodo consiste nell utilizzare il metodo dei gradienti non per aggiornare i pesi del modello, che rimangono fissi, ma per aggiornare l'immagine "evidenziando" le caratteristiche che vengono riconosciute da uno o più layer scelti fra quelli che compongono l'archietttura.  
 
Durante l'addestramento della rete si è utilizzata la [[Retropropagazione|discesa del gradiente]] per aggiornare i valori dei coefficienti del modello, calcolati rispetto alla [[Funzione Obiettivo (loss)|funzione di perdita]], in modo da andare nella direzione di minimizzarla.


Dal punto di vista computazionale, però: per ogni pixel dell'immagine, quanto bisogna incrementarne il valori per massimizzare la verosomiglianza?
In Deep Dream invece si calcolano i '''gradienti dell'immagine rispetto all'attivazione''': questi gradienti vengono poi aggiunti all'immagine, intensificando i pattern visti dalla rete in quei layer. Questa tecnica viene chiamata "gradient ascent" o ascesa del gradiente.


Il Root Mean Squared Error delle attivazioni di un determinato layer (rispetto a una matrice di zeri per esempio) è una rappresentazione della distanza. E' possibile calcolare il gradiente dei valori RGB dell'immagine rispetto a questa funzione di perdita, per esempio in Pytorch molto semplicemente con Autograd. Una volta trovata questa matrice, essa viene aggiunta all'immagine, moltiplicando sempre per la learning rate.
Il Root Mean Error (RME) delle attivazioni di un determinato layer (rispetto a una matrice di zeri per esempio) è una rappresentazione della distanza. E' possibile calcolare il gradiente dei valori RGB dell'immagine rispetto a questa funzione di perdita, per esempio in Pytorch molto semplicemente con Autograd. Una volta trovata questa matrice, essa viene aggiunta all'immagine, moltiplicando sempre per la learning rate.  


Nelle varie implementazioni, questa matrice viene poi ammorbidita applicando ad essa un filtro gaussiano 2D: i gradienti vengono poi '''standardizzati'''.
Nelle varie implementazioni, questa matrice di gradienti viene poi ammorbidita applicando ad essa un filtro gaussiano 2D - i gradienti vengono infine standardizzati prima di essere aggiunti al valore in pixel che rappresenta l'immagine.


=== Data augmentation e processamento frattale dell'immagine ===
=== Data augmentation e processamento frattale dell'immagine ===
Riga 34: Riga 38:


Una cosa molto interessante menzionata nel blog post originale, è che le immagini che emergono "dipendono" dal contenuto originale dell'immagine, a parità di layer esposti.
Una cosa molto interessante menzionata nel blog post originale, è che le immagini che emergono "dipendono" dal contenuto originale dell'immagine, a parità di layer esposti.
=== Bibliografia ===
[https://web.archive.org/web/20150708233542/http://googleresearch.blogspot.com/2015/06/inceptionism-going-deeper-into-neural.html Inceptionism: Going Deeper into Neural Networks]
[https://web.archive.org/web/20150708233542/http://googleresearch.blogspot.co.uk/2015/07/deepdream-code-example-for-visualizing.html DeepDream - a code example for visualizing Neural Networks]
[[Categoria:Modello]]
[[Categoria:Modello]]

Versione delle 22:20, 28 mag 2024

DeepDream
Nome Inglese DeepDream
Sigla
Anno Di Creazione 2015-06-18
Versione Corrente
URL https://research.google/blog/inceptionism-going-deeper-into-neural-networks/
Pubblicazione Inceptionism: Going Deeper into Neural Networks
URL Pubblicazione https://research.google/blog/inceptionism-going-deeper-into-neural-networks/


Nel 2015, Alexander Mordvintsev, sviluppatore di Google, ha pubblicato un blog post contenente la descrizione di quello che diventò uno dei più interessanti e singolari esperimenti fatti con le reti neurali. Essendo anche un un'artista interattivo, aveva un particolare sensibilità nell'utilizzare algoritmi e modelli in un modo non convenzionale e creativo.

Il ricercatore fa la seguente prova: fornisce un'immagine in input a una rete neurale convoluzionale pre-addestrata per la classificazione di immagini, come ResNet, VGG16, o GoogLeNet, ma non vuole classificarla. In realtà vuole usarla per capire quali sono le caratteristiche che una rete convoluzionale "vede".

Alexander ipotizza che quindi i risultati intermedi per modificare l'immagine di input in modo da massimizzare le attivazioni di uno o più strati della rete neurale, predeterminati. In questo modo il modello di classificazione viene effettivamente utilizzato come un "generatore".

Sono state viste tre implementazioni:

Come funziona

La particolarità di questo metodo consiste nell utilizzare il metodo dei gradienti non per aggiornare i pesi del modello, che rimangono fissi, ma per aggiornare l'immagine "evidenziando" le caratteristiche che vengono riconosciute da uno o più layer scelti fra quelli che compongono l'archietttura.

Durante l'addestramento della rete si è utilizzata la discesa del gradiente per aggiornare i valori dei coefficienti del modello, calcolati rispetto alla funzione di perdita, in modo da andare nella direzione di minimizzarla.

In Deep Dream invece si calcolano i gradienti dell'immagine rispetto all'attivazione: questi gradienti vengono poi aggiunti all'immagine, intensificando i pattern visti dalla rete in quei layer. Questa tecnica viene chiamata "gradient ascent" o ascesa del gradiente.

Il Root Mean Error (RME) delle attivazioni di un determinato layer (rispetto a una matrice di zeri per esempio) è una rappresentazione della distanza. E' possibile calcolare il gradiente dei valori RGB dell'immagine rispetto a questa funzione di perdita, per esempio in Pytorch molto semplicemente con Autograd. Una volta trovata questa matrice, essa viene aggiunta all'immagine, moltiplicando sempre per la learning rate.

Nelle varie implementazioni, questa matrice di gradienti viene poi ammorbidita applicando ad essa un filtro gaussiano 2D - i gradienti vengono infine standardizzati prima di essere aggiunti al valore in pixel che rappresenta l'immagine.

Data augmentation e processamento frattale dell'immagine

Image Pyramid

Tutte le implementazioni viste contemplano l'utilizzo di uno "shift" randomico sui due assi ad ogni iterazione, questo permette all'algoritmo di lavorare anche sui bordi delle immagini (immagino).

Importante è il processing di tipo frattale, o "per ottave", nel quale l'immagine sottocampionata e portata alla dimensione dell'immagine originale, per poi essere progressivamente ingrandita: in questo modo i pattern si visualizzano su svariate scale, in modo "frattale".

Una cosa molto interessante menzionata nel blog post originale, è che le immagini che emergono "dipendono" dal contenuto originale dell'immagine, a parità di layer esposti.

Bibliografia

Inceptionism: Going Deeper into Neural Networks

DeepDream - a code example for visualizing Neural Networks