2016-07-02 44 views
9

Stavo pensando di provare a selezionare i parametri iper (ad esempio la regolarizzazione) utilizzando la convalida incrociata o magari allenare più inizializzazioni di un modello e quindi scegliere il modello con la massima precisione di convalida incrociata. L'implementazione di k-fold o CV è semplice ma noiosa/fastidiosa (specialmente se sto cercando di addestrare modelli diversi in CPU, GPU o computer diversi, ecc.). Mi aspetterei che una libreria come TensorFlow abbia qualcosa di simile implementato per il suo utente in modo da non dover codificare la stessa cosa 100 volte. Quindi, TensorFlow ha una libreria o qualcosa che può aiutarmi a fare Cross Validation?TensorFlow ha implementato la convalida incrociata per i suoi utenti?


Come aggiornamento, sembra che si possa usare scikit o qualcos'altro per farlo. Se questo è il caso, allora se qualcuno può fornire un semplice esempio di addestramento NN e di convalida incrociata con scikit, sarebbe fantastico! Non sono sicuro se questo si riduca a più cpus, gpus, cluster ecc.

+2

TF è solo una libreria di calcolo, non è una libreria ML in quanto tale. Cosa c'è che non va semplicemente con lo scikit? Imparare intorno ad esso? Hai troppi dati per caricarlo in memoria e hai bisogno di una suddivisione dei dati basata su "op"? – lejlot

+0

Non sapevo che si potesse usare scikit-learn per questo. Bello! Controllerò. (Mi chiedo se scala per molti computer e cose del genere) – Pinocchio

risposta

1

Poiché il set di dati diventa più grande, la convalida incrociata diventa più costosa. Nell'apprendimento approfondito di solito si utilizzano set di dati di grandi dimensioni. Si dovrebbe andare bene con un semplice allenamento. Tensorflow non ha un meccanismo incorporato per cv in quanto non viene solitamente utilizzato nelle reti neurali. Nelle reti neurali, l'efficienza della rete si basa principalmente sul set di dati, sul numero di epoche e sul tasso di apprendimento.

ho usato cv in sklearn È possibile controllare il link: https://github.com/hackmaster0110/Udacity-Data-Analyst-Nano-Degree-Projects/

In questo, andare a poi_id.py a individuare le frodi dai dati Enron (nella cartella di progetto)

1

Come già discusso, tensorflow non fornisce il proprio modo di convalidare in modo incrociato il modello. Il modo consigliato è utilizzare KFold. È un po 'noioso, ma fattibile. Ecco un esempio completo di cross-validazione modello MNIST con tensorflow e KFold:

from sklearn.model_selection import KFold 
import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data 

# Parameters 
learning_rate = 0.01 
batch_size = 500 

# TF graph 
x = tf.placeholder(tf.float32, [None, 784]) 
y = tf.placeholder(tf.float32, [None, 10]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
pred = tf.nn.softmax(tf.matmul(x, W) + b) 
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
init = tf.global_variables_initializer() 

mnist = input_data.read_data_sets("data/mnist-tf", one_hot=True) 
train_x_all = mnist.train.images 
train_y_all = mnist.train.labels 
test_x = mnist.test.images 
test_y = mnist.test.labels 

def run_train(session, train_x, train_y): 
    print "\nStart training" 
    session.run(init) 
    for epoch in range(10): 
    total_batch = int(train_x.shape[0]/batch_size) 
    for i in range(total_batch): 
     batch_x = train_x[i*batch_size:(i+1)*batch_size] 
     batch_y = train_y[i*batch_size:(i+1)*batch_size] 
     _, c = session.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y}) 
     if i % 50 == 0: 
     print "Epoch #%d step=%d cost=%f" % (epoch, i, c) 

def cross_validate(session, split_size=5): 
    results = [] 
    kf = KFold(n_splits=split_size) 
    for train_idx, val_idx in kf.split(train_x_all, train_y_all): 
    train_x = train_x_all[train_idx] 
    train_y = train_y_all[train_idx] 
    val_x = train_x_all[val_idx] 
    val_y = train_y_all[val_idx] 
    run_train(session, train_x, train_y) 
    results.append(session.run(accuracy, feed_dict={x: val_x, y: val_y})) 
    return results 

with tf.Session() as session: 
    result = cross_validate(session) 
    print "Cross-validation result: %s" % result 
    print "Test accuracy: %f" % session.run(accuracy, feed_dict={x: test_x, y: test_y})