我正在考虑尝试使用交叉验证来选择超参数(例如正则化),或者可能训练模型的多个初始化,然后选择具有最高交叉验证精度的模型。实现k-fold或CV很简单但很乏味/烦人(特别是如果我试图在不同的CPU,GPU甚至不同的计算机等中训练不同的模型)。我希望像TensorFlow这样的库可以为用户实现这样的东西,这样我们就不需要对同一个东西进行100次编码了。那么,TensorFlow是否有一个可以帮助我进行交叉验证的库或其他东西?
作为更新,似乎可以使用scikit learn或其他方法来执行此操作。如果是这种情况,那么如果有人可以提供一个简单的NN培训示例和scikit的交叉验证,那就太棒了!不确定这是否会扩展到多个cpus,gpus,cluster等。
答案 0 :(得分:12)
如前所述,tensorflow没有提供自己的交叉验证模型的方法。建议的方法是使用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})
答案 1 :(得分:4)
随着数据集变得越来越大,交叉验证变得更加昂贵。在深度学习中,我们通常使用大型数据集。您应该可以通过简单的培训来完成。 Tensorflow没有内置的cv机制,因为它通常不用于神经网络。在神经网络中,网络的效率主要依赖于数据集,时期数和学习率。
我在sklearn中使用了cv 你可以查看链接: https://github.com/hackmaster0110/Udacity-Data-Analyst-Nano-Degree-Projects/
在那里,转到poi_id.py识别来自安然数据的欺诈行为(在项目文件夹中)
答案 2 :(得分:-1)
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
的随机训练和测试子集。