web-dev-qa-db-ja.com

TensorFlowには、ユーザー向けにクロス検証が実装されていますか?

クロス検証を使用してハイパーパラメーター(正則化など)を選択するか、モデルの複数の初期化をトレーニングしてから、クロス検証の精度が最も高いモデルを選択しようと考えていました。 k-foldまたはCVの実装は簡単ですが、面倒/面倒です(特に、異なるCPU、GPU、または異なるコンピューターなどで異なるモデルをトレーニングしようとする場合)。 TensorFlowのようなライブラリでは、このようなものがユーザーに実装されるため、同じことを100回コーディングする必要はありません。したがって、TensorFlowには、相互検証を行うのに役立つライブラリまたは何かがありますか?


更新として、scikit Learnまたは他の何かを使用してこれを行うことができるようです。この場合、誰でもNNトレーニングの簡単な例を提供し、scikitとの相互検証を行うことができれば、それは素晴らしいことです!ただし、これが複数のcpus、gpus、clusterなどに拡張されるかどうかはわかりません。

20
Pinocchio

すでに説明したように、テンソルフローはモデルを相互検証する独自の方法を提供していません。推奨される方法は、 KFold を使用することです。それは少し退屈ですが、実行可能です。 tensorflowおよびKFoldを使用したMNISTモデルの相互検証の完全な例を次に示します。

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

データセットが大きくなると、クロスバリデーションのコストが高くなります。ディープラーニングでは、通常、大きなデータセットを使用します。簡単なトレーニングで十分です。 Tensorflowは、通常ニューラルネットワークでは使用されないため、cvの組み込みメカニズムを備えていません。ニューラルネットワークでは、ネットワークの効率は主にデータセット、エポック数、および学習率に依存します。

Sklearnでcvを使用しました。リンクを確認できます。 https://github.com/hackmaster0110/Udacity-Data-Analyst-Nano-Degree-Projects/

その中で、エンロンデータから不正を特定する(プロジェクトフォルダ内)のpoi_id.pyに移動します

4
user6359857