Come gestire le immagini di grandi dimensioni nella CNN?


15

Supponiamo che ci siano 10K immagini di dimensioni 2400 x 2400 da usare in CNN. A mio avviso, i computer convenzionali che le persone useranno saranno utili. Ora la domanda è come gestire dimensioni di immagini così grandi dove non vi sono privilegi di downsampling.

Ecco i requisiti di sistema: -

Ubuntu 16.04 64-bit RAM 16 GB GPU 8 GB HDD 500 GB

1) Esistono tecniche per gestire immagini così grandi che devono essere addestrate?
2) Quale dimensione del lotto è ragionevole da usare?
3) Ci sono delle precauzioni da prendere o qualsiasi aumento e diminuzione delle risorse hardware che posso fare?

Risposte:


14

Ora la domanda è come gestire dimensioni di immagini così grandi dove non vi sono privilegi di downsampling

Presumo che per downsampling intendi ridimensionare l'input prima di passarlo in CNN. Il livello convoluzionale consente di sottocampionare l'immagine all'interno di una rete, selezionando un grande passo, che consentirà di risparmiare risorse per i livelli successivi. In effetti, è quello che deve fare, altrimenti il ​​tuo modello non si adatta alla GPU.

1) Esistono tecniche per gestire immagini così grandi che devono essere addestrate?

Comunemente le ricerche ridimensionano le immagini a dimensioni accettabili. Ma se questa non è un'opzione per te, dovrai limitare la tua CNN. Oltre al downsampling nei primi layer, ti consiglio di sbarazzarti del layer FC (che normalmente prende la maggior parte dei parametri) a favore del layer convoluzionale . Inoltre dovrai trasmettere i tuoi dati in streaming in ogni epoca, perché non si adattano alla tua GPU.

Nota che nulla di tutto ciò impedirà un pesante carico computazionale nei primi livelli, proprio perché l'input è così grande: la convoluzione è un'operazione costosa e i primi livelli eseguiranno molto in ogni passaggio avanti e indietro. In breve, l'allenamento sarà lento.

2) Quale dimensione del lotto è ragionevole da usare?

Ecco un altro problema. Una singola immagine prende2400x2400x3x4 (3 canali e 4 byte per pixel) che è ~ 70Mb, quindi difficilmente puoi permetterti anche una dimensione batch 10. Più realisticamente sarebbe 5. Nota che la maggior parte della memoria sarà presa dai parametri CNN. Penso che in questo caso abbia senso ridurre le dimensioni utilizzando valori a 16 bit anziché a 32 bit: in questo modo sarai in grado di raddoppiare i batch.

3) Ci sono delle precauzioni da prendere o qualsiasi aumento e diminuzione delle risorse hardware che posso fare?

Il tuo collo di bottiglia è la memoria GPU. Se puoi permetterti un'altra GPU, prendila e dividi la rete su di esse. Tutto il resto è insignificante rispetto alla memoria GPU.


1
Grazie. Ho già seguito alcuni dei suggerimenti che hai fornito in questa risposta. Buona risposta.
WaterRocket8236,

5

Di solito per le immagini il set di funzionalità è il valore della densità dei pixel e in questo caso porterà a un set di funzionalità piuttosto grande; si sconsiglia inoltre di sottoporre a campionamento le immagini in quanto si potrebbero perdere (effettivamente si perderanno) dati importanti.

[1] Ma ci sono alcune tecniche che possono aiutarti a ridurre le dimensioni del set di funzionalità, approcci come PCA (Principle Component Analysis) ti aiutano nella selezione di importanti sottogruppi di funzionalità.

Per informazioni dettagliate consultare il link http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Oltre a ciò per ridurre le spese di calcolo durante l'addestramento della rete neurale, è possibile utilizzare la Discesa gradiente stocastica, piuttosto che l'uso convenzionale dell'approccio Discesa gradiente, che ridurrebbe le dimensioni del set di dati richiesto per l'addestramento in ciascuna iterazione. Pertanto, la dimensione del set di dati da utilizzare in una iterazione ridurrebbe, riducendo così il tempo necessario per la formazione della rete.

La dimensione esatta del batch da utilizzare dipende dalla distribuzione del set di dati di training e del set di dati di test, un uso più generale è 70-30. Dove è anche possibile utilizzare l'approccio stocastico sopra menzionato per ridurre il tempo richiesto.

Dettaglio per la discesa del gradiente stocastico http://scikit-learn.org/stable/modules/sgd.html

[3] L'hardware sembra appropriato per l'aggiornamento sarebbe necessario, tuttavia se necessario, guardare soluzioni cloud come AWS dove è possibile ottenere l'abbonamento gratuito all'account fino a un limite di utilizzo.


Grazie per la risposta. Aggiorna la risposta se ottieni maggiori informazioni.
WaterRocket8236,

Grazie per quel link su Discesa gradiente stocastica e benvenuti in AI!
DukeZhou

2

Dati così grandi non possono essere caricati nella tua memoria. Dividi ciò che puoi fare in due:

  1. Ridimensiona tutte le immagini in dimensioni ridotte. Puoi ridimensionarli a 112x112 pixel. Nel tuo caso, poiché hai un'immagine quadrata, non sarà necessario ritagliare. Non sarai ancora in grado di caricare tutte queste immagini nella tua RAM a un obiettivo.

  2. L'opzione migliore è utilizzare una funzione di generatore che fornirà i dati in batch. Fare riferimento all'uso di fit_generator come utilizzato in Keras. Se i parametri del modello diventano troppo grandi per adattarsi alla memoria della GPU, considerare l'utilizzo della normalizzazione batch o l'utilizzo di un modello residuo per ridurre il numero di parametri.


3
Perché dovresti scegliere una dimensione di 112x112 pixel? Non è una potenza di 2 e non un divisore di 2400.
Andi R

@AndiR. Ecco la cosa Quando si tratta di dimensioni di input, si è liberi di scegliere qualsiasi dimensione. Questo perché, se ci sono incompatibilità dimensionali nella rete, questo può essere facilmente risolto usando zero padding. Pertanto, non esiste una metodologia fissa per la dimensione dell'input. Ciò di cui bisogna stare attenti è assicurarsi che un campionamento eccessivo non influisca sulla qualità di input. Dai un'occhiata a questo documento che utilizza la dimensione 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.