2014-09-29 25 views
7

Sto provando ad usare la libreria Theano in python per fare alcuni esperimenti con Deep Belief Networks. Io uso il codice in questo indirizzo: DBN full code. Questo codice utilizza MNIST Handwritten database. Questo file è già in formato pickle. È unpicked in:Come inserire il set di dati in un file .pkl nel formato esatto e nella struttura dati utilizzata in "mnist.pkl.gz"?

  • train_set
  • valid_set
  • test_set

che viene ulteriormente deserializzata in:

  • train_set_x, train_set_y = train_set
  • valid_set_x, valid_set_y = valid_set
  • test_set_x, test_set_y = test_set

favore qualcuno può darmi il codice che costruisce questo set di dati al fine di creare il mio? L'esempio DBN che utilizzo ha bisogno dei dati in questo formato e non so come farlo. se qualcuno ha qualche idea su come risolvere questo problema, per favore dimmi.

Ecco il mio codice:

from datetime import datetime 
import time 
import os 
from pprint import pprint 
import numpy as np 
import gzip, cPickle 
import theano.tensor as T 
from theano import function 


os.system("cls") 

filename = "completeData.txt" 


f = open(filename,"r") 
X = [] 
Y = [] 

for line in f: 
     line = line.strip('\n') 
     b = line.split(';') 
     b[0] = float(b[0]) 
     b[1] = float(b[1]) 
     b[2] = float(b[2]) 
     b[3] = float(b[3]) 
     b[4] = float(b[4]) 
     b[5] = float(b[5]) 
     b[6] = float(b[6]) 
     b[7] = float(b[7]) 
     b[8] = float(b[8]) 
     b[9] = float(b[9]) 
     b[10] = float(b[10]) 
     b[11] = float(b[11]) 
     b[12] = float(b[12]) 
     b[13] = float(b[13]) 
     b[14] = float(b[14]) 
     b[15] = float(b[15]) 
     b[17] = int(b[17]) 
     X.append(b[:16]) 
     Y.append(b[17]) 

Len = len(X); 
X = np.asmatrix(X) 
Y = np.asarray(Y) 

sizes = [0.8, 0.1, 0.1] 
arr_index = int(sizes[0]*Len) 
arr_index2_start = arr_index + 1 
arr_index2_end = arr_index + int(sizes[1]*Len) 
arr_index3_start = arr_index2_start + 1 

""" 
train_set_x = np.array(X[:arr_index]) 
train_set_y = np.array(Y[:arr_index]) 

val_set_x = np.array(X[arr_index2_start:arr_index2_end]) 
val_set_y = np.array(Y[arr_index2_start:arr_index2_end]) 

test_set_x = np.array(X[arr_index3_start:]) 
test_set_y = np.array(X[arr_index3_start:]) 

train_set = train_set_x, train_set_y 
val_set = val_set_x, val_set_y 
test_set = test_set_x, test_set_y 
""" 
x = T.dmatrix('x') 
z = x 
t_mat = function([x],z) 

y = T.dvector('y') 
k = y 
t_vec = function([y],k) 

train_set_x = t_mat(X[:arr_index].T) 
train_set_y = t_vec(Y[:arr_index]) 
val_set_x = t_mat(X[arr_index2_start:arr_index2_end].T) 
val_set_y = t_vec(Y[arr_index2_start:arr_index2_end]) 
test_set_x = t_mat(X[arr_index3_start:].T) 
test_set_y = t_vec(Y[arr_index3_start:]) 

train_set = train_set_x, train_set_y 
val_set = val_set_x, val_set_y 
test_set = test_set_x, test_set_y 

dataset = [train_set, val_set, test_set] 

f = gzip.open('..\..\..\data\dex.pkl.gz','wb') 
cPickle.dump(dataset, f, protocol=-1) 
f.close() 

pprint(train_set_x.shape) 

print('Finished\n') 
+0

È possibile implementare semplicemente Python in base alla descrizione seguente. –

risposta

5

Un file .pkl non è necessario per adattare il codice dell'esercitazione Theano ai propri dati. Hai solo bisogno di imitare la loro struttura dati.

correzione rapida

cercare le seguenti righe. È la riga 303 su DBN.py.

datasets = load_data(dataset) 
train_set_x, train_set_y = datasets[0] 

sostituire con la propria train_set_x e train_set_y.

my_x = [] 
my_y = [] 
with open('path_to_file', 'r') as f: 
    for line in f: 
     my_list = line.split(' ') # replace with your own separator instead 
     my_x.append(my_list[1:-1]) # omitting identifier in [0] and target in [-1] 
     my_y.append(my_list[-1]) 
train_set_x = theano.shared(numpy.array(my_x, dtype='float64')) 
train_set_y = theano.shared(numpy.array(my_y, dtype='float64')) 

Adattarlo ai dati di input e al codice che si sta utilizzando.

La stessa cosa funziona per cA.py, dA.py e SdA.py ma usano solo train_set_x.

Cercare posti come n_ins=28 * 28 in cui le dimensioni dell'immagine di mnist sono hardcoded. Sostituire 28 * 28 con il proprio numero di colonne.

Spiegazione

Questo è dove si mettono i dati in un formato che può lavorare con Theano.

train_set_x = theano.shared(numpy.array(my_x, dtype='float64')) 
train_set_y = theano.shared(numpy.array(my_y, dtype='float64')) 

shared() trasforma una matrice numpy nel formato Teanò progettato per l'efficienza su GPU.

dtype='float64' è previsto negli array Theano.

Maggiori dettagli su basic tensor functionality.

.pkl il file

Il file .pkl è un modo per salvare la struttura di dati.

È possibile creare il proprio.

import cPickle 
f = file('my_data.pkl', 'wb') 
    cPickle.dump((train_set_x, train_set_y), f, protocol=cPickle.HIGHEST_PROTOCOL) 
f.close() 

Maggiori dettagli su loading and saving.

4

Il file in salamoia rappresenta una tupla di 3 liste: training set, il set di validazione e il testing set. (treno, val, test)

  • Ciascuno dei tre elenchi è una coppia formata da un elenco di immagini e un elenco di etichette di classe per ciascuna delle immagini.
  • Un'immagine viene rappresentata come una matrice monodimensionale numerica di 784 (28 x 28) valori mobili tra 0 e 1 (0 sta per nero, 1 per bianco).
  • Le etichette sono numeri compresi tra 0 e 9 che indicano quale cifra rappresenta l'immagine.
2

Questo può aiutare:

from PIL import Image 
from numpy import genfromtxt 
import gzip, cPickle 
from glob import glob 
import numpy as np 
import pandas as pd 
Data, y = dir_to_dataset("trainMNISTForm\\*.BMP","trainLabels.csv") 
# Data and labels are read 

train_set_x = Data[:2093] 
val_set_x = Data[2094:4187] 
test_set_x = Data[4188:6281] 
train_set_y = y[:2093] 
val_set_y = y[2094:4187] 
test_set_y = y[4188:6281] 
# Divided dataset into 3 parts. I had 6281 images. 

train_set = train_set_x, train_set_y 
val_set = val_set_x, val_set_y 
test_set = test_set_x, val_set_y 

dataset = [train_set, val_set, test_set] 

f = gzip.open('file.pkl.gz','wb') 
cPickle.dump(dataset, f, protocol=2) 
f.close() 

Questa è la funzione che ho usato. Può cambiare in base ai dettagli del file.

def dir_to_dataset(glob_files, loc_train_labels=""): 
    print("Gonna process:\n\t %s"%glob_files) 
    dataset = [] 
    for file_count, file_name in enumerate(sorted(glob(glob_files),key=len)): 
     image = Image.open(file_name) 
     img = Image.open(file_name).convert('LA') #tograyscale 
     pixels = [f[0] for f in list(img.getdata())] 
     dataset.append(pixels) 
     if file_count % 1000 == 0: 
      print("\t %s files processed"%file_count) 
    # outfile = glob_files+"out" 
    # np.save(outfile, dataset) 
    if len(loc_train_labels) > 0: 
     df = pd.read_csv(loc_train_labels) 
     return np.array(dataset), np.array(df["Class"]) 
    else: 
     return np.array(dataset)