Sto cercando di addestrare il mio modello che classifica le immagini. Il problema che ho è che hanno dimensioni diverse. come dovrei formattare le mie immagini / o l'architettura del modello?
Sto cercando di addestrare il mio modello che classifica le immagini. Il problema che ho è che hanno dimensioni diverse. come dovrei formattare le mie immagini / o l'architettura del modello?
Risposte:
Non hai detto di quale architettura stai parlando. Dato che hai detto di voler classificare le immagini, presumo che sia una rete in parte convoluzionale, in parte completamente connessa come AlexNet, GoogLeNet, ecc. In generale, la risposta alla tua domanda dipende dal tipo di rete con cui stai lavorando.
Se, ad esempio, la tua rete contiene solo unità convoluzionali, vale a dire non contiene livelli completamente connessi, può essere invariante alla dimensione dell'immagine in ingresso. Una tale rete potrebbe elaborare le immagini in ingresso e a sua volta restituire un'altra immagine ("convoluzionale fino in fondo"); dovresti assicurarti che l'output corrisponda a quello che ti aspetti, dal momento che devi determinare la perdita in qualche modo, ovviamente.
Se stai utilizzando unità completamente connesse, però, sei nei guai: qui hai un numero fisso di pesi appresi con cui la tua rete deve lavorare, quindi input variabili richiederebbero un numero variabile di pesi - e questo non è possibile.
Se questo è il tuo problema, ecco alcune cose che puoi fare:
N
immagini diverse di dimensioni corrette.L'opzione di riempimento potrebbe introdurre un'ulteriore fonte di errore nella previsione della rete, poiché la rete potrebbe (leggi: probabilmente lo sarà) essere influenzata dalle immagini che contengono un bordo così imbottito. Se hai bisogno di qualche idea, dai un'occhiata alla sezione Immagini della documentazione di TensorFlow, ci sono pezzi del genere resize_image_with_crop_or_pad
che portano via il lavoro più grande.
Per quanto riguarda il non preoccuparsi dello schiacciamento, ecco un pezzo della pipeline di pre-elaborazione della famosa rete Inception:
# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.
# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
distorted_image,
lambda x, method: tf.image.resize_images(x, [height, width], method=method),
num_cases=num_resize_cases)
Ne sono totalmente consapevoli e lo fanno comunque.
A seconda di quanto lontano vuoi o devi andare, in realtà c'è un documento qui chiamato Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognition che gestisce input di dimensioni arbitrarie elaborandoli in un modo molto speciale.
Prova a creare uno strato di raggruppamento piramidale spaziale. Quindi inseriscilo dopo il tuo ultimo livello di convoluzione in modo che i livelli FC ottengano sempre vettori dimensionali costanti come input. Durante l'addestramento, addestrare le immagini dall'intero set di dati utilizzando una particolare dimensione dell'immagine per un'epoca. Quindi, per l'epoca successiva, passare a una dimensione dell'immagine diversa e continuare l'allenamento.