DeepDream: differenze tra le versioni

Da Wiki AI.
Nessun oggetto della modifica
Nessun oggetto della modifica
 
(7 versioni intermedie di 2 utenti non mostrate)
Riga 10: Riga 10:
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.
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.


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".
Il ricercatore utilizza una tipica rete neurale convoluzionale pre-addestrata per la classificazione di immagini, come [[Rete Neurale Residua (ResNet)|ResNet]], [[VGG16 (ConvNet)|VGG16]], o [[GoogLeNet]], per capire quali sono le caratteristiche salienti che una rete convoluzionale "cattura" a ogni livello della sua architettura di ''deep-learning''.


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".
=== Dettaglio dell'implementazione ===
[[File:Image218479932.png|miniatura|435x435px|(A) AlexNet consiste di cinque layer convoluzionali (Conv) seguiti da tre layer completamente connessi (FC). (B) Le mappe di attivazione da ciascuno dei cinque layer convoluzionali di AlexNet sono state estratte per tre immagini di esempio (ghepardo, peso e aquila calva). I canali presentati sono quelli che mostrano l'attivazione media massima per quella specifica immagine in ciascuno dei cinque layer convoluzionali.]]
[https://www.researchgate.net/figure/Learned-features-from-a-Convolutional-Neural-Network_fig1_319253577 Come è noto], dopo l'addestramento di una rete convoluzionale per la classificazione di immagini, i suoi primi layer estraggono le informazioni sui pattern più semplici, come spigoli e linee; i layer intermedi trattano forme più elaborate, come foglie, o ruote, e gli strati finali o più "profondi" si attivano rispetto a intere "interpretazioni", come un'edificio, o una pianta.


Sono state viste tre implementazioni:
L'algoritmo di Deep Dream, scelto un layer, e data un'immagine di input, vede le mappe di attivazione (''feature maps'') nei layer d'interesse, e poi cambia iterativamente l'immagine di input per '''massimizzare''' queste attivazioni. In questo modo il modello di classificazione viene effettivamente utilizzato come un "generatore".
 
Per studiare con precisione la realizzazione dell'algoritmo, sono state considerate tre implementazioni:


* [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è]
Riga 20: Riga 24:
* [https://www.tensorflow.org/tutorials/generative/deepdream implementazione ufficiale in Tensorflow]
* [https://www.tensorflow.org/tutorials/generative/deepdream implementazione ufficiale in Tensorflow]


=== Dettagli sull'algoritmo ===
==== La "gradient ascent" ====
[[File:VGG16.png|destra|senza_cornice|444x444px]]
[[File:VGG16.png|444x444px|miniatura|Architettura di VGG-16]]
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.  
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.
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.


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.
In Deep Dream invece si calcolano i '''gradienti dell'immagine rispetto all'attivazione.''' Questo significa che, per ogni iterazione dell'algoritmo:


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.
* si calcola la funzione obiettivo come la media (per esempio MSE ma anche L2) delle attivazioni di uno specifico layer. Nelle implementazioni studiate si prende sempre la media di tutti i filtri (anche chiamati canali) di uno specifico layer: se un layer convoluzionale ha 64 filtri, produrrà 64 feature maps, una per ciascun filtro (queste feature maps sono i "canali" di quel layer). O spesso gli autori delle implementazioni selezionate scelgono le attivazioni dell'output [[ReLU]] dei layer considerati.
 
* si calcola il gradiente dei pixel dell'immagine rispetto a questa funzione obiettivo: questa derivata parziale dice quanto la funzione obiettivo crescerà al cambiamento dei pixel specifici
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.
* viene effettuato uno smoothing sui gradienti ottenuti, che poi vengono aggiunti all'immagine originale iterativamente, scalandoli con il coefficiente di '''learning rate''', intensificando in questo modo i pattern che attivano la rete neurale in quei layer. Questa tecnica viene chiamata "gradient ascent" o ascesa del gradiente.


=== Data augmentation e processamento frattale dell'immagine ===
=== Data augmentation e processamento frattale dell'immagine ===
[[File:Image Pyramid.png|miniatura|163x163px|Image Pyramid]]
[[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 e aggiunge varietà alle immagini generate a ogni iterazione.


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, pur focalizzando l'algoritmo sugli stessi layer, dipendono dal contenuto originale dell'immagine.


=== Bibliografia ===
=== Bibliografia ===
Riga 44: Riga 48:


[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]
[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]
[https://cs.nyu.edu/%7Efergus/papers/zeilerECCV2014.pdf Visualizing and Understanding Convolutional Networks]
[https://cs231n.github.io/understanding-cnn/ Visualizing what ConvNets learn (CS231)]
[[Categoria:Modello]]
[[Categoria:Modello]]
{{#seo:
            |title=DeepDream
            |title_mode=append
            |keywords=reti neurali, deep learning, visione artificiale, elaborazione immagini, Google, intelligenza artificiale, algoritmi, software, computer vision, deepdream
            |description=Scopri DeepDream, un esperimento di Google che utilizza le reti neurali per generare immagini surreali e psichedeliche. L'algoritmo, basato su reti convoluzionali pre-addestrate, amplifica i pattern rilevati nelle immagini, creando illusioni ottiche e scenari fantastici. Esplora il funzionamento di DeepDream, dalla gradient ascent al data augmentation, e scopri come questa tecnica ha influenzato l'arte generativa.
            |image=Deepdream.png
            }}

Versione attuale delle 16:26, 17 ago 2024

Sinistra: Foto originale di Zachi Evenor. Destra: processata da Günther Noack, Software Engineer
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 utilizza una tipica rete neurale convoluzionale pre-addestrata per la classificazione di immagini, come ResNet, VGG16, o GoogLeNet, per capire quali sono le caratteristiche salienti che una rete convoluzionale "cattura" a ogni livello della sua architettura di deep-learning.

Dettaglio dell'implementazione

(A) AlexNet consiste di cinque layer convoluzionali (Conv) seguiti da tre layer completamente connessi (FC). (B) Le mappe di attivazione da ciascuno dei cinque layer convoluzionali di AlexNet sono state estratte per tre immagini di esempio (ghepardo, peso e aquila calva). I canali presentati sono quelli che mostrano l'attivazione media massima per quella specifica immagine in ciascuno dei cinque layer convoluzionali.

Come è noto, dopo l'addestramento di una rete convoluzionale per la classificazione di immagini, i suoi primi layer estraggono le informazioni sui pattern più semplici, come spigoli e linee; i layer intermedi trattano forme più elaborate, come foglie, o ruote, e gli strati finali o più "profondi" si attivano rispetto a intere "interpretazioni", come un'edificio, o una pianta.

L'algoritmo di Deep Dream, scelto un layer, e data un'immagine di input, vede le mappe di attivazione (feature maps) nei layer d'interesse, e poi cambia iterativamente l'immagine di input per massimizzare queste attivazioni. In questo modo il modello di classificazione viene effettivamente utilizzato come un "generatore".

Per studiare con precisione la realizzazione dell'algoritmo, sono state considerate tre implementazioni:

La "gradient ascent"

Architettura di VGG-16

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. Questo significa che, per ogni iterazione dell'algoritmo:

  • si calcola la funzione obiettivo come la media (per esempio MSE ma anche L2) delle attivazioni di uno specifico layer. Nelle implementazioni studiate si prende sempre la media di tutti i filtri (anche chiamati canali) di uno specifico layer: se un layer convoluzionale ha 64 filtri, produrrà 64 feature maps, una per ciascun filtro (queste feature maps sono i "canali" di quel layer). O spesso gli autori delle implementazioni selezionate scelgono le attivazioni dell'output ReLU dei layer considerati.
  • si calcola il gradiente dei pixel dell'immagine rispetto a questa funzione obiettivo: questa derivata parziale dice quanto la funzione obiettivo crescerà al cambiamento dei pixel specifici
  • viene effettuato uno smoothing sui gradienti ottenuti, che poi vengono aggiunti all'immagine originale iterativamente, scalandoli con il coefficiente di learning rate, intensificando in questo modo i pattern che attivano la rete neurale in quei layer. Questa tecnica viene chiamata "gradient ascent" o ascesa del gradiente.

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 e aggiunge varietà alle immagini generate a ogni iterazione.

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, pur focalizzando l'algoritmo sugli stessi layer, dipendono dal contenuto originale dell'immagine.

Bibliografia

Inceptionism: Going Deeper into Neural Networks

DeepDream - a code example for visualizing Neural Networks

Visualizing and Understanding Convolutional Networks

Visualizing what ConvNets learn (CS231)