web-dev-qa-db-fra.com

TensorFlow a-t-il mis en place une validation croisée pour ses utilisateurs?

Je pensais essayer de choisir des hyper paramètres (comme la régularisation par exemple) en utilisant la validation croisée ou peut-être former plusieurs initialisations d'un modèle, puis choisir le modèle avec la plus grande précision de validation croisée. La mise en œuvre de k-fold ou CV est simple mais fastidieuse/ennuyeuse (surtout si j'essaie de former différents modèles dans différents CPU, GPU ou même différents ordinateurs, etc.). Je m'attendrais à ce qu'une bibliothèque comme TensorFlow implémente quelque chose comme ça pour son utilisateur afin que nous n'ayons pas à coder la même chose 100 fois. Ainsi, TensorFlow possède-t-il une bibliothèque ou quelque chose qui peut m'aider à effectuer la validation croisée?


En tant que mise à jour, il semble que l'on puisse utiliser scikit learn ou autre chose pour le faire. Si tel est le cas, alors si quelqu'un peut fournir un exemple simple de formation NN et de validation croisée avec scikit, ce serait génial! Je ne sais pas si cela évolue vers plusieurs cpus, gpus, clusters, etc.

20
Pinocchio

Comme déjà discuté, tensorflow ne fournit pas sa propre méthode de contre-validation du modèle. La méthode recommandée consiste à utiliser KFold . C'est un peu fastidieux, mais faisable. Voici un exemple complet de validation croisée du modèle MNIST avec tensorflow et 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})
13
Maxim

Au fur et à mesure que l'ensemble de données augmente, la validation croisée devient plus coûteuse. Tensorflow n'a pas de mécanisme intégré pour le cv car il n'est généralement pas utilisé dans les réseaux de neurones. Dans les réseaux de neurones, l'efficacité du réseau repose principalement sur l'ensemble de données, le nombre d'époques et le taux d'apprentissage.

J'ai utilisé le cv dans sklearn Vous pouvez vérifier le lien: https://github.com/hackmaster0110/Udacity-Data-Analyst-Nano-Degree-Projects/

Dans ce cas, accédez à poi_id.py dans Identify fraud from data enron (In Project folder)

4
user6359857