Внедряет ли TensorFlow перекрестное подтверждение для своих пользователей?

Я думал о том, чтобы попытаться выбрать гиперпараметры (например, например, регуляризация) с использованием перекрестной проверки или, может быть, организовать несколько инициализаций моделей, а затем выбрать модель с максимальной точностью проверки соответствия. Реализация k-fold или CV проста, но утомительна/раздражает (особенно, если я пытаюсь обучать разные модели на разных CPU, GPU или даже на разных компьютерах и т.д.). Я бы ожидал, что в библиотеке, подобной TensorFlow, будет реализовано что-то подобное для своего пользователя, так что нам не нужно вводить код один раз в 100 раз. Таким образом, у TensorFlow есть библиотека или что-то, что может помочь мне выполнить Cross Validation?


Как обновление, кажется, можно использовать scikit learn или что-то еще для этого. Если это так, то если кто-то может предоставить простой пример обучения NN и перекрестной проверки с помощью scikit, это было бы потрясающе! Не уверен, что это масштабируется до нескольких процессоров, gpus, кластеров и т.д. Однако.

Ответ 1

Как уже обсуждалось, тензор потока не предоставляет свой собственный способ перекрестной проверки модели. Рекомендуемый способ - использовать KFold. Это немного утомительно, но выполнимо. Вот полный пример перекрестной проверки модели MNIST с tensorflow и 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})

Ответ 2

По мере увеличения набора данных перекрестная проверка становится дороже. В глубоком обучении мы обычно используем большие наборы данных. Вы должны быть в порядке с простым обучением. Tensorflow не имеет встроенного механизма для cv, поскольку он обычно не используется в нейронных сетях. В нейронных сетях эффективность сети зависит главным образом от набора данных, количества эпох и скорости обучения.

Я использовал cv в sklearn Вы можете проверить ссылку: https://github.com/hackmaster0110/Udacity-Data-Analyst-Nano-Degree-Projects/

В этом перейдите к poi_id.py в разделе Определение мошенничества из данных enron (в папке Project)

Ответ 3

Другой вариант, который вы бы использовали со sklearn:

sklearn.model_selection.train_test_split(*arrays, **options)

Пример использования:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

Разбиение массивов или матриц X и y на случайные поезда и тестирование подмножеств размера 42.