2016-01-27 10 views
15

Desidero creare un set di dati che abbia lo stesso formato del set di dati cifar-10 da utilizzare con Tensorflow. Dovrebbe avere immagini ed etichette. Fondamentalmente, mi piacerebbe essere in grado di prendere il codice cifar-10 ma diverse immagini ed etichette ed eseguire quel codice. Non ho trovato alcuna informazione su come farlo online e sono completamente nuovo nell'apprendimento automatico.Come creare set di dati simile a cifar-10

risposta

18

Ho eseguito correttamente il codice CIFAR10 su alcuni dei miei propri set di dati. Credo che dovrei essere in grado di darti una buona risposta.

Prima di farlo, però, abbiamo bisogno di capire il formato in cui il set di dati CIFAR10 è in Se ci riferiamo a:. https://www.cs.toronto.edu/~kriz/cifar.html, e in particolare, la sezione di versione binaria, vediamo questo:

In altre parole, il primo byte è l'etichetta della prima immagine, che è un numero compreso tra 0 e 9. I successivi 3072 byte corrispondono ai valori di pixel dell'immagine. I primi 1024 byte sono i valori del canale rosso , il 1024 successivo il verde e il 1024 finale il blu. I valori sono memorizzati in ordine di riga principale, quindi i primi 32 byte corrispondono ai valori del canale rosso della prima riga dell'immagine.

Intuitivamente, è necessario memorizzare i dati in questo formato. Quello che puoi fare in un primo momento come una sorta di esperimento di base, è quello di ottenere immagini che abbiano esattamente le stesse dimensioni e lo stesso numero di classi di CIFAR10 e le inseriscano in questo formato. Ciò significa che le tue immagini dovrebbero avere una dimensione di 32x32x3 e avere 10 classi. Se riesci a eseguire correttamente questa operazione, puoi passare a casi fattoriali come canali singoli, input di dimensioni diverse e classi diverse. Fare ciò significherebbe che devi modificare molte variabili nelle altre parti del codice. Devi lentamente farti strada attraverso.

Sono nel bel mezzo di elaborare un modulo generale. Il mio codice per questo è in https://github.com/jkschin/svhn. Se fai riferimento al codice svhn_flags.py, vedrai molte bandiere che possono essere modificate per soddisfare le tue esigenze. Ammetto che ora è criptico, perché non l'ho ripulito in modo che sia leggibile, ma funziona. Se sei disposto a passare un po 'di tempo a dare un'occhiata approssimativa, scoprirai qualcosa.

Questo è probabilmente il modo più semplice per eseguire il proprio set di dati su CIFAR10. Ovviamente potresti semplicemente copiare la definizione della rete neurale e implementare il tuo lettore, il formato di input, il batching, ecc., Ma se vuoi che funzioni velocemente, sintonizza i tuoi input per adattarli a CIFAR10.

Spero che questo aiuti.

EDIT:

Alcuni codice davvero di base che spero avrebbe aiutato.

from PIL import Image 
import numpy as np 

im = Image.open('images.jpeg') 
im = (np.array(im)) 

r = im[:,:,0].flatten() 
g = im[:,:,1].flatten() 
b = im[:,:,2].flatten() 
label = [1] 

out = np.array(list(label) + list(r) + list(g) + list(b),np.uint8) 
out.tofile("out.bin") 

Ciò convertire un'immagine in un file di byte che è pronto per l'uso in CIFAR10. Per più immagini, continua a concatenare gli array, come indicato nel formato sopra. Per verificare se il tuo formato è corretto, in particolare per il caso d'uso di Asker, dovresti ottenere una dimensione del file di 427 * 427 * 3 + 1 = 546988 byte. Supponendo che le tue immagini siano RGB e i valori vanno da 0 a 255. Una volta verificato, è tutto pronto per l'esecuzione in TensorFlow. Usa TensorBoard per visualizzare forse un'immagine, solo per garantire la correttezza.

EDIT 2:

Come da domanda del richiedente nei commenti,

if not eval_data: 
    filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i) 
       for i in xrange(1, 6)] 

Se davvero vuole farlo funzionare così com'è, è necessario studiare le chiamate di funzione di codice CIFAR10. In cifar10_input, i batch sono hardcoded. Quindi devi modificare questa riga di codice per adattarla al nome del file bin. In alternativa, è sufficiente distribuire le immagini in 6 file in modo uniforme.

+0

Grazie mille! Se posso chiedere, non sono sicuro che sia da qualche parte nel tuo codice, ma questo è il motivo per cui sono principalmente confuso: ho le immagini (in questo momento jpeg) e le etichette (assumiamo 1 hot vettori). Come leggo entrambi quelli in modo che si adattino al formato che mi serve? O come devo convertirli nel formato richiesto (con i byte). Se questo è nel tuo codice, non lo trovo. La mia domanda è: come posso convertire un'etichetta jpeg + in una lista di byte che sono sia etichette che canali? – BlackyTheCat

+0

Dipende davvero dal tuo set di dati. Di solito non carico i miei parser perché non sono universali. Posso sapere quali immagini stai usando? Inoltre, è più facile memorizzare l'etichetta come numero intero, poiché è così che è stato codificato CIFAR10. Posso scriverti del codice e aggiornare la risposta. – jkschin

+0

Sto usando jpegs (foto galassia, voglio classificare le galassie alla fine). Possono essere ridimensionati a qualsiasi dimensione, al momento sono 427x427. Le etichette che convertirò in interi molto probabilmente (suppongo che tu intenda da 0 a 9 o da 1 a 10, giusto?). – BlackyTheCat

1

per SVHN dataset Si può provare in questo modo per le immagini in ingresso multipli:

import numpy as np 
import scipy.io 

mat = scipy.io.loadmat('train_32x32.mat') 
data = mat['X'] 
label = mat['y'] 

R_data = data[:,:,0,:] 
G_data = data[:,:,1,:] 
B_data = data[:,:,2,:] 

R_data = np.transpose(R_data, (2,0,1)) 
G_data = np.transpose(G_data, (2,0,1)) 
B_data = np.transpose(B_data, (2,0,1)) 

R_data = np.reshape(R_data,(73257,32*32)) 
G_data = np.reshape(G_data,(73257,32*32)) 
B_data = np.reshape(B_data,(73257,32*32)) 

outdata = np.concatenate((label,R_data,G_data,B_data), axis = 1) 
step = 10000 
for i in range(1,6): 
    temp = outdata[i*step:(i+1)*step,:] 
    temp.tofile('SVHN_train_data_batch%d.bin' % i) 
    print('save data %d' % i) 
2

non ho trovato nessuna delle risposte per fare quello che volevo ho fatto la mia soluzione. Può essere trovato sul mio GitHub qui: https://github.com/jdeepee/machine_learning/tree/master

Questo script convertirà e la quantità di immagini in addestramento e i dati di test in cui gli array hanno la stessa forma del set di dati di cifar10.

Il codice è commentato quindi dovrebbe essere abbastanza facile da seguire. Dovrei annotare iterato attraverso una directory principale contenente più cartelle che contengono le immagini.

+0

E le etichette? Da dove li stai leggendo? Potresti fornire una struttura di directory di esempio? –

+1

Dalla memoria, credo che ogni directory nella directory di input corrisponda a un'etichetta di immagine. Quindi se stavi classificando per immagini di cani, gatti e uccelli vorresti tre directory: cani, gatti e uccelli con le immagini corrispondenti nelle suddette directory.L'etichetta di classificazione 1 indica quindi una classificazione "cane" 2 a "gatto" e così via. – Joshua

+0

L'ho già capito da solo, ma grazie per la risposta! –