当前位置: 首页 > 面试题库 >

为什么增加批次大小时TensorFlow示例失败?

封飞
2023-03-14
问题内容

我在看初学者的Tensorflow
MNIST示例
,发现在这一部分中:

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})

将批次大小从100更改为204以上会导致模型无法收敛。它可以工作到204,但是在205以及我尝试的任何更高数字下,精度最终都将小于10%。这是错误,还是关于算法的问题,还是其他问题?

这正在运行他们的OS X二进制安装,似乎是0.5.0版。


问题答案:

您在初学者示例中使用的是非常基本的线性模型吗?

这是调试它的技巧-在增加批处理大小时观察交叉熵(第一行来自示例,第二行是我刚刚添加的):

cross_entropy = -tf.reduce_sum(y_*tf.log(y))
cross_entropy = tf.Print(cross_entropy, [cross_entropy], "CrossE")

批次大小为204,您将看到:

I tensorflow/core/kernels/logging_ops.cc:64] CrossE[92.37558]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[90.107414]

但是在205,您会从一开始就看到这样的序列:

I tensorflow/core/kernels/logging_ops.cc:64] CrossE[472.02966]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[475.11697]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1418.6655]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1546.3833]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1684.2932]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1420.02]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[1796.0872]
I tensorflow/core/kernels/logging_ops.cc:64] CrossE[nan]

Ack-NaN出现。基本上,大批生产会产生巨大的渐变,以至于您的模型逐渐失去控制-应用的更新过大,并大大超出了方向。

实际上,有几种方法可以解决此问题。您可以将学习率从.01降低到.005,最终精度为0.92。

train_step = tf.train.GradientDescentOptimizer(0.005).minimize(cross_entropy)

或者,您可以使用更复杂的优化算法(Adam,Momentum等),尝试做更多的工作来找出梯度的方向。或者,您可以使用更复杂的模型,该模型具有更多自由参数,可以分散较大的梯度。



 类似资料:
  • 问题内容: 一位同事让我意识到了一个非常奇怪的MySQL行为。 假设您有一个表,其中包含一个auto_increment字段和另一个设置为唯一的字段(例如,用户名字段)。尝试插入表中已有用户名的行时,插入失败,正如预期的那样。然而,几次尝试失败后插入有效的新条目时,可以看到auto_increment值增加了。 例如,当我们的上一个条目如下所示时… …并且在下一次插入时尝试使用相同的用户名值尝试五

  • 问题内容: 我不明白为什么 ‘chown’ 命令应该增加我的docker映像的大小? 以下Dockerfile创建大小为5.3MB的映像: 但是,此示例创建的图像大小为8.7MB: 为什么? 注意: 我的实际dockerfile当然比该示例长得多,因此映像大小的增加也很大。这就是为什么我什至在乎。 问题答案: Dockerfile中的每个步骤都会生成一个新的中间映像或“层”,该文件由文件系统中与上

  • 笔记: 必须安装Java。获取JRE(http://www.java.com)或者JDK 从环境变量JAVA_HOME(C:\Program Files\Java\jdk1.8.0_251)...13:07:44.382[main]ERRORegistry.java:35ServiceDiscoveryIorg.kie.api.KieService: 131-加载失败,因为已经存在一个服务ervi

  • 问题内容: 您好,我有一个带有处理程序的Netty Server,该处理程序应接受字符串。似乎最多只能接收1024个字节的内容。我如何增加缓冲区大小。我已经尝试过 没有成功。 处理程序如下 } 问题答案: 您正在使用UDP吗?如果是这样,数据包将最大为1024字节。此代码注释在QOTM代码示例中: 允许的数据包最大为1024字节(默认值为768)。您可以增加或减小此值,以避免数据包被截断或分别改善

  • 问题内容: 在Transact-SQL中,批处理是一组一起提交并作为一个组执行的SQL语句,一个接一个地执行。批处理可以存储在命令文件中。 包含多个SQL语句的* .sql文件是否被视为批处理?我们还认为批次是什么? 问题答案: 包含多个sql语句的* .sql文件是否被视为批处理? 有点。一个文件通常是一个批处理,但它也可能包含若干批次。您可以通过批处理分隔符来分隔单独的批处理。您可能需要在一个