Cosa sono gli autocodificatori?
Il Novembre 11, 2021 da adminUna leggera introduzione agli autocodificatori e alle loro varie applicazioni,l’API Python di alto livello di TensorFlow per costruire e addestrare modelli di deep learning.
常常見到 Autoencoder 的變形以及應用,打算花幾篇的時間好好的研究一下,順便練習 Tensorflow.keras 的 API 使用。
- Cosa è Autoencoder
- Tipi di Autoencoder
- Applicazione di Autoencoder
- Implementazione
- Grandi esempi
- Conclusione
Difficoltà: ★ ★ ☆ ☆ ☆
後記: 由於 Tensorflow 2.0 alpha 已於 3/8號釋出,但此篇是在1月底完成的,故大家可以直接使用安裝使用看看,但需要更新至相對應的 CUDA10。
Che cos’è Autoencoder?
首先,什麼是 Autoencoder 呢? 不囉唆,先看圖吧!

Il concetto originale di Autoencoder è molto semplice, è quello di buttare dentro un dato di input e ottenere esattamente gli stessi dati del dato di input attraverso una rete neurale.Il codificatore prende prima i dati in ingresso, li comprime in un vettore di dimensioni più piccole Z, e poi immette lo Z nel decodificatore per riportare lo Z alla sua dimensione originale.Sembra facile, ma diamo un’occhiata più da vicino e vediamo se è così facile.

Encoder:
Encoder è responsabile della compressione dei dati di input originali in un vettore bidimensionale C. Questo C, che di solito chiamiamo codice, vettore latente o vettore di caratteristiche, ma io sono solito chiamarlo spazio latente, perché C rappresenta una caratteristica nascosta.Encoder può comprimere i dati originali in un vettore bidimensionale significativo, il che significa che Autoencoder ha una riduzione della dimensionalità, e lo strato nascosto ha una trasformazione non lineare di attivazione, quindi questo Encoder è come una versione potente di PCA, perché Encoder può fare una trasformazione non lineareriduzione di dimensione!
Decoder:
Quello che fa il Decoder è di restituire lo spazio latente ai dati di input il più possibile, che è una trasformazione dei vettori di caratteristiche dallo spazio dimensionale inferiore allo spazio dimensionale superiore.
Così come si misura quanto bene Autoencoder sta lavorando! Semplicemente confrontando la somiglianza dei due dati di input originali con i dati ricostruiti.Quindi la nostra funzione di perdita può essere scritta come ….
Funzione di perdita:

Perché vogliamo minimizzare la differenza traAutoEncoder è addestrato utilizzando la backpropagation per aggiornare i pesi, proprio come una normale rete neurale.aggiornare i pesi.
Per riassumere, Autoencoder è ….
1. un’architettura di modello molto comune, comunemente usata anche per l’apprendimento non supervisionato
2. può essere usato come metodo di riduzione delle dimensioni per l’apprendimento non lineare
3. può essere usato per imparare la rappresentazione dei dati, con trasformazioni di caratteristiche rappresentative
A questo punto, dovrebbe essere facile capire com’è Autoencoder, l’architettura è molto semplice, quindi diamo un’occhiata alle sue trasformazioni!
Tipi di Autoencoder
Dopo aver spiegato i principi di base di AutoEncoder, è ora di dare un’occhiata all’uso esteso e avanzato di Autoencoder, in modo che tu possa vedere l’uso esteso di Autoencoder!
2-1. Unet:
Unet può essere usato come uno dei mezzi di segmentazione delle immagini, e l’architettura Unet può essere vista come una variante di Autoencoder.

2-2. Autocodificatori ricorsivi:
Questa è una rete che combina il nuovo testo di input con lo spazio latente di altri input, lo scopo di questa rete è la classificazione del sentimento.Questo può anche essere visto come una variante di Autoencoder, che estrae il testo sparso mentre viene digitato e trova lo spazio latente che è importante.

2-Seq2Seq:
Sequence to Sequence è un modello generativo che è stato molto popolare per un po’ di tempo. È una soluzione meravigliosa al dilemma dei tipi RNN che non sono in grado di gestire accoppiamenti indeterminati, e ha funzionato bene su argomenti come chatbot e generazione di testo.Questo può anche essere visto come una sorta di architettura Autoencoder.

Applicazioni di Autoencoder
Dopo aver visto le molte e varie varianti di Autoencoder, vediamo dove altro può essere usato Autoencoder!
3-1. Peso preaddestrato del modello
Autocodificatore può anche essere usato per il preaddestramento del peso, il che significa che il modello trova un valore iniziale migliore.Per esempio, quando vogliamo completare il modello target come target. strato nascosto è:, così all’inizio usiamo il concetto di autoencoder per inserire 784 dimensioni, e lo spazio latente nel mezzo è 1000 dimensioni per fare il pretrain prima, così queste 1000 dimensioni possono ben mantenere l’inputPoi rimuoviamo l’output originale e aggiungiamo il secondo strato, e così via.In questo modo l’intero modello avrà un valore di partenza migliore.
Huh! C’è una parte strana… se si usano 1000 neuroni per rappresentare 784 dimensioni di input, non significa che la rete deve essere copiata da capo? Qual è lo scopo dell’allenamento? Sì, ecco perché in un pre-allenamento come questo, di solito aggiungiamo il regolarizzatore L1 norm in modo che lo strato nascosto non sia copiato da capo.

Secondo il signor Li HongyiIn passato, era più comune usare tale metodo per il pre-addestramento, ma ora, a causa dell’aumento delle capacità di addestramento, non c’è più bisogno di usare questo metodo.Ma se avete pochi dati con etichetta ma un mucchio di dati senza etichetta, potete usare questo metodo per fare il pre-addestramento del peso perché Autoencoder stesso è un metodo di apprendimento non supervisionato, usiamo i dati senza etichetta per ottenere prima il pre-addestramento del peso, e poi usiamo i dati senza etichetta per ottenere il pre-addestramento del peso.Usiamo i dati non etichettati per ottenere prima il pre-allenamento dei pesi, e poi usiamo i dati etichettati per mettere a punto i pesi, in modo da ottenere un buon modello.Per maggiori dettagli, guardate il video del signor Li, è spiegato molto bene!
3-2. Segmentazione dell’immagine
Il modello Unet che abbiamo appena visto, diamo un’occhiata di nuovo, perché è fondamentalmente il problema di rilevamento dei difetti più comune nell’industria manifatturiera di Taiwan.
Prima dobbiamo etichettare i dati di input, che saranno il nostro output. Quello che dobbiamo fare è costruire una rete, inserire l’immagine originale (a sinistra, le radiografie dei denti) e generare l’output (a destra, la classificazione della struttura dei denti).In questo caso, il decoder & codificatore sarà uno strato di convoluzione con un forte giudizio grafico, estraendo caratteristiche significative e deconvoluzione di nuovo nel decoder per ottenere il risultato di segmentazione.

3-3. Video to Text
Per un problema di didascalie di immagini come questo, usiamo il modello sequence to sequence, dove i dati di input sono un gruppo di foto e l’output è un testo che descrive le foto.Il modello sequence to sequence utilizza LSTM + Conv net come encoder & decoder, che può descrivere una sequenza di azioni sequenziali & utilizzando il kernel CNN per estrarre lo spazio latente richiesto nell’immagine.ma questo compito è molto difficile da fare, quindi vi lascerò provare se siete interessati!

3-4. Image Retrieval
Image Retrieval La cosa da fare è inserire un’immagine e cercare di trovare la corrispondenza più vicina, ma se si confrontano i pixel, allora è davvero facileSe si usa Autoencoder per comprimere prima l’immagine nello spazio latente e poi calcolare la similarità sullo spazio latente dell’immagine, il risultato sarà molto migliore.Il risultato è molto migliore perché ogni dimensione nello spazio latente può rappresentare una certa caratteristica.Se la distanza è calcolata sullo spazio latente, è ragionevole trovare immagini simili.In particolare, questo sarebbe un ottimo modo di apprendimento non supervisionato, senza etichettare i dati!

EccoIl documento di Georey E. Hinton, il famoso dio del Deep Learning, mostra il grafico che vuoi cercare in alto a sinistra, mentre gli altri sono tutti i grafici che l’autoencoder pensa siano molto simili.7133>

Content-BasedImage Retrieval
3-5. Anomaly Detection
Non riesco a trovare una buona immagine, quindi ho dovuto usare questa LOL
Trovare anomalie è anche un problema di produzione super comune, quindi anche questo problema può essere provato con AutoencoderPossiamo provare con Autoencoder!Prima di tutto, parliamo dell’effettivo verificarsi delle anomalie. Le anomalie di solito si verificano molto raramente, per esempio, segnali anomali nella macchina, picchi improvvisi di temperatura ……, ecc.Questo accade una volta al mese (se di più, la macchina dovrebbe essere costretta a ritirarsi). Se i dati vengono raccolti ogni 10 secondi, allora 260.000 pezzi di dati saranno raccolti ogni mese, ma solo un periodo di tempo è anomalo, che è in realtà una quantità molto sbilanciata di dati.
Quindi il modo migliore per affrontare questa situazione è andare per i dati originali, che è la più grande quantità di dati che abbiamo dopo tutto!Se possiamo prendere i dati buoni e addestrare un buon autocodificatore, allora se arrivano delle anomalie, allora naturalmente la grafica ricostruita si romperà.È così che abbiamo iniziato l’idea di usare l’autoencoder per trovare le anomalie!

Implementazione
Qui usiamo Mnist come esempio giocattolo e implementiamo un Autoencoder usando l’API di alto livello di Tensorflow.keras! Poiché il nuovo pacchetto per tf.keras è stato rilasciato a breve, ci esercitiamo ad usare il metodo di sottoclasse Model nel file
4-1. Creare un modello – Vallina_AE:
Prima di tutto, importa tensorflow!7133>

L’uso di tf.keras è così semplice, basta digitare tf.keras!(Non so di cosa sto parlando lol)
Carico dati & preprocesso del modello
Prima prendiamo i dati Mnist da tf.keras.dataset e facciamo un piccolo preprocesso
Nomalize: comprimere i valori tra 0 e 1, l’allenamento sarà più facile da convergere
Binarization: evidenziare le aree più evidenti, l’allenamento darà risultati migliori.
Creare un modello – Vallina_AE:
Questo è il metodo fornito dal documento Tensorflow per creare modelli.più complesso.
Quello che ho imparato finora è creare il livello nel posto __init __ e definire il passaggio in avanti nella chiamata.
Quindi usiamo due modelli sequenziali per creare l’encoder & decoder. due sono una struttura simmetrica, l’encoder è collegato allo strato di ingresso che è responsabile del trasporto dei dati di ingresso e poi ai tre strati densi. il decoder è lo stesso.
Di nuovo, sotto la chiamata, dobbiamo concatenare il codificatore & decodificatore, definendo prima lo spazio latente come uscita di self.encoder
.come uscita di self.encoder
, e poi la ricostruzione come risultato del passaggio del decoder.Usiamo poi tf.keras.Model()
per collegare i due modelli che abbiamo definito in __init__
.AE_model = tf.keras.Model(inputs = self.encoder.input, outputs = reconstruction)
specifica input come ingresso del codificatore e output come uscita del decodificatore, e questo è tutto!Poi restituiamo l’AE_model e il gioco è fatto!
Compilazione del modello & training
Prima che Keras possa addestrare un modello, esso deve essere compilato prima di poter essere inserito nel training.Nella compilazione specificate l’ottimizzatore che volete usare e la perdita che volete calcolare.
Per l’allenamento usate VallinaAE.fit
per inserire i dati, ma ricordate che ci stiamo ripristinando, quindi X e Y devono essere lanciati negli stessi dati.
Diamo un’occhiata ai risultati dell’allenamento di 100 epoche, sembra che i risultati di ricostruzione non siano così buoni come pensavamo.

4-2. Creare un modello- Conv_AE:
Come il nome implica, possiamo usare lo strato di convoluzione come strato nascosto per imparare caratteristiche che possono essere ricostruite.
Dopo aver cambiato il modello, puoi dare un’occhiata ai risultati per vedere se c’è qualche miglioramento.

Sembra che i risultati di Reconstruction siano molto migliori, con circa 10 epoche di allenamento.
4-3. Creare un modello – denoise_AE:
Inoltre, l’autocodificatore può essere usato per la rimozione del rumore, quindi qui
Prima di tutto, possiamo aggiungere del rumore all’immagine originale. La logica dell’aggiunta del rumore è di fare un semplice spostamento sul pixel originale e poi aggiungere numeri casuali.La parte di pre-elaborazione dell’immagine può essere fatta semplicemente rendendo il clip 0 se è più piccolo di 0 e 1 se è più grande di 1. Come mostrato sotto, dopo l’elaborazione dell’immagine del clip, possiamo rendere l’immagine più nitida e le aree ovvie diventano più visibili.Questo ci dà un risultato migliore quando buttiamo in Autoencoder.

e il modello stesso e Conv_AENon c’è differenza tra il modello stesso e Conv_AE, eccetto che durante il fit deve essere cambiato in
denoise_AE.fit(train_images_noise, train_images, epochs=100, batch_size=128, shuffle=True)
per ripristinare il noise_data originale ai dati di input originali

Come potete vedere, su Mnist, un semplice Autoencoder ottiene un effetto di denoising molto rapido.
Grandi esempi
Questa è una buona risorsa per chi è interessato a saperne di più
- Costruire autocodificatori in Keras la serie autoencoder è scritta chiaramente.
- Tensorflow 2.0 ufficiale documentazione tutorial, qualcosa di molto completo, solo scrivere un po ‘difficile, di spendere un bel po’ di tempo per vedere (almeno io tirare XD)
3. Li Hongyi insegnante di apprendimento profondo è anche molto consigliato, parlare molto chiaro e facile da capire, non
Conclusione
Utilizzate questo articolo per stabilire rapidamente il concetto di base di Autoencoder, alcune varianti di Autoencoder e l’applicazione discenari.4310>
I prossimi articoli inizieranno con i modelli generativi, estendendosi dal concetto di autoencoder, VAE, a GAN, e ulteriori estensioni e morphing lungo la strada.
Se ti piace l’articolo, per favore clicca qualche altro applauso (non solo una volta) come incoraggiamento!
Leggi il codice completo di questo articolo:https://github.com/EvanstsaiTW/Generative_models/blob/master/AE_01_keras.ipynb
Lascia un commento