可以放入 session.run 的向量大小是否有任意限制?

Is there an arbitary limit on the size of vectors you can put into session.run?

我最近开始学习tensorflow,我在tensorflow网站上做第一个教程,遇到了问题。

我在 Cloud 9 上使用 tensorflow。

起始码没有问题:

import tensorflow as tf
import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

x = tf.placeholder(tf.float32, [None, 784]);
W = tf.Variable(tf.zeros([784, 10]));
b = tf.Variable(tf.zeros([10]));

y = tf.nn.softmax(tf.matmul(x, W) + b);

y_ = tf.placeholder(tf.float32, [None, 10]);
cross_entropy = -tf.reduce_sum(y_ * tf.log(y));

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy);

init = tf.initialize_all_variables();

xs = mnist.train.images;
ys = mnist.train.labels;

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1));
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

sess = tf.Session();
sess.run(init);

在教程的训练部分,它说从 55000 张图像的整个训练集中获取每批 100 张图像会更快。代码是:

for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
  print str(i) + " -> " + str(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}));

这很有效,我得到了教程所说的 %91 准确率。

然后我尝试将整个集合发送到训练中,因为教程建议的计算量很大。我将迭代保持在较低水平以查看实际发生的情况。

for i in range(100):
    sess.run(train_step, feed_dict = {x: batch_xs, y_: batch_ys});
    print str(i) + " -> " + str(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}));

然而,无论迭代次数如何,我总是得到 0.098 的准确度。

然后我尝试了另一种方法来达到相同的结果。

for i in range(100):
    for start, end in zip(range(0,len(xs),50), range(50, len(ys), 50)):
        sess.run(train_step, feed_dict = {x: xs[start:end], y_: ys[start:end]});
    print str(i) + " -> " + str(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}));

在这个例子中,它以 50 x 50 的速度遍历整个集合。这个方法可以达到 200 x 200。在 200 之后,无论数字是多少,我的准确度都是 0.098。

据我了解,您可以发送到培训中的项目数量是有任意限制的。是真的还是我遗漏了什么?

谢谢。

示例数量没有限制,但学习率(0.01 在您的情况下)与批量大小相互作用。如果您将批量大小扩大 10 倍,那么您的梯度就会大 10 倍,并且您的步长也会增加 10 倍。这可能会导致过度调整并在每一步增加而不是减少 objective。您需要调整您的学习率(尝试按批量大小乘数的平方根潜水),或使用自适应下降法(AdamOptimizer 将随时间自动调整学习率)