DeepDream: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
Riga 17: | Riga 17: | ||
* https://www.tensorflow.org/tutorials/generative/deepdream | * https://www.tensorflow.org/tutorials/generative/deepdream | ||
=== Il trattamento | === Il trattamento dei gradienti === | ||
[[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, 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. | ||
Dal punto di vista computazionale, però: per ogni pixel dell'immagine, quanto bisogna | Dal punto di vista computazionale, però: per ogni pixel dell'immagine, quanto bisogna incrementarne il valori per massimizzare la verosomiglianza? | ||
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. | |||
Nelle varie implementazioni, questa matrice viene poi ammorbidita applicando ad essa un filtro gaussiano 2D: i gradienti vengono poi '''standardizzati'''. | |||
=== Data augmentation e processamento frattale dell'immagine === | === Data augmentation e processamento frattale dell'immagine === | ||
[[File:Image Pyramid.png|miniatura|163x163px|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). | 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". | 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. | 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. | ||
[[Categoria:Modello]] | [[Categoria:Modello]] |
Versione delle 10:57, 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 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.
Alexander fa esattamente il seguente tentativo. Presa una rete neurale convoluzionale per la classificazione di immagini, come ResNet, 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.
Sono state viste tre implementazioni:
- l'implementazione originale in Caffè
- un'implementazione in Pytorch piuttosto recente e ben scritta
- https://www.tensorflow.org/tutorials/generative/deepdream
Il trattamento dei gradienti

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 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.
Dal punto di vista computazionale, però: per ogni pixel dell'immagine, quanto bisogna incrementarne il valori per massimizzare la verosomiglianza?
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.
Nelle varie implementazioni, questa matrice viene poi ammorbidita applicando ad essa un filtro gaussiano 2D: i gradienti vengono poi standardizzati.
Data augmentation e processamento frattale dell'immagine

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.