【发布时间】:2017-09-30 07:49:22
【问题描述】:
我正在尝试围绕一台笔记本电脑训练神经网络的能力来校准我的期望。我正在使用 tensorflow 和 keras,大约 10 分钟后,它崩溃了。我见过killsignal 9 exit code 137,我想知道这是不是因为内存不足?其他时候,当使用np_utils.to_categorical() 进行单热编码时,我在控制台中看到了memoryerror 字样,仅此而已,我的脚本崩溃了。这只是试图将输出转换为神经网络在运行之前所期望的。
我有 6400 个输入和 1500 个输出以及一个包含 100 个节点的小型隐藏层。批量大小 128。
而已。它甚至不深。无论使用 nvidia gpu 还是 4 核 cpu,它都会崩溃。对于专业人士来说,我的网络是否太大而无法在我的系统上进行训练(i7 4 核,16gb 内存,nvidia GT 750m,计算能力 3.0)。我的神经网络算大吗?顺便说一句,我有 300 万个样本。
1) 如何估算我的网络所需的内存量?是6400 (# inputs) * 1500 (#outputs) * 4 bytes (per parameter) = 38.4 gb吗?我可以在某处的Mac上实时查看正在使用多少内存吗?我用过活动监视器,内存压力表正常。
2) GPU 通常最大内存为 8gb-12gb,而台式机上的 CPU 可以轻松拥有 64gb。那么如果我的网络的内存需求超过 8gb 的 RAM,就不可能在单个 GPU 上进行训练吗?
3)batch_size 和batch_training 之间有什么区别,尤其是内存方面的区别?
谢谢!
【问题讨论】:
-
可能问题出在“300 万个样本”中。为什么不将其拆分为较小的批次,例如“100.000 个样本”,即使使用
fit时,仍然传递一个小的batch_size,也许是200。 -
评估网络的内存需求并非易事。作为一个粗略的指导,查看你的张量形状,查看变量类型,并将形状乘以类型的内存需求,然后将所有内容相加。例如,如果您定义了一个 6400 个单位的输入层、100 个隐藏层和 1500 个输出层,并且假设它们都是
tf.float64,那么您的最小内存需求(不考虑权重、偏差和所有开销)将为 (64 * 6400 + 100 * 64 + 1500 * 64) * batch_size。如果您一次将所有 300 万个样本输入其中,那么这将达到大约 1.4GB。 -
也就是说,可能还有很多其他事情正在发生,查看您的模型代码可能会有所帮助。
-
您好,您能详细介绍一下您的计算吗?我必须在将位转换为 GB 时遇到问题。大多数批处理大小只有 128,但您是说即使我将批处理大小设置为 3,000,000,总内存也是 1.4 GB,这是任何笔记本电脑都应该能够处理的非常小的内存。
-
根据我的计算,每个样本您将使用
6400 * 100 + 100 * 1500 = 790000 * 4 = 3160000 / 1000000 = 3.16MB(不考虑偏差,但这可以忽略不计)。我认为您的 GPU 内存是 2 GB。这意味着每批最多可以容纳 590 个样本。你的批量大小比这个大吗?你也有验证吗?如果是,您是在fit内还是在某个回调内计算它?如果是,您还必须将验证批次大小添加到 590 个样本中。同样根据您的描述,您的 CPU RAM 用完了(也许)。所以可能你想一次考虑一大块样本。
标签: tensorflow deep-learning keras