当前位置: 首页 > 知识库问答 >
问题:

如何判断我的神经网络是否由于内存错误而崩溃?

通典
2023-03-14

我正试图通过一台笔记本电脑训练神经网络的能力来校准我的期望值。我正在使用tensorflow和keras,大约10分钟后,它崩溃了。我看到了killsignal 9退出代码137,我想知道这是否是因为内存不足?其他时候,当一个热编码使用np\u utils.to\u category()时,我在控制台中看到单词memoryerror,就是这样,我的脚本崩溃了。这只是试图在神经网络运行之前将输出转换为它所期望的。我有6400个输入和1500个输出,还有一个由100个节点组成的小隐藏层。批量128。就这样。甚至都不深。无论是使用nvidia gpu还是4核cpu,它都会崩溃。对于专业人士,我的网络是否太大,无法在我的系统上进行训练(i7 4核,16gb ram,nvidia GT 750m,计算能力3.0)。我的神经网络算大吗?顺便说一句,我有300万个样品。

1) 如何估计网络所需的内存量?它是否6400(#输入)*1500(#输出)*4字节(每个参数)=38.4 gb?我能看看mac电脑某处实时使用了多少内存吗?我用过活动监视器,记忆压力表正常。2) GPU的最大内存通常为8gb-12gb,而台式机上的CPU很容易达到64GB。因此,如果我的网络内存需求超过8gb的RAM,是否不可能在单个GPU上进行训练?3) 批处理大小和批处理训练之间有什么区别,特别是在记忆方面?非常感谢。

共有2个答案

阚原
2023-03-14

查找神经网络的内存需求不仅取决于网络的大小或参数本身的数量。为了计算神经网络的记忆足迹,我经常去的一个文档是斯坦福CS231n视觉识别卷积神经网络课程笔记。请看一下他们找到网络每一层的内存需求的部分。

此外,批处理大小(每个批处理的输入数量)是决定“内存使用”的关键因素。例如,在较新的NVIDIA P100 GPU中,如果我训练CIFAR10模型,我可以每批处理多达2048张图像,如果我在ImageNet数据集上训练AlexNet,则可以处理少于512或256张图像。输入大小很重要,批处理大小也很重要,因为GPU内存需要考虑批处理的输入。

测试批量大小的一种方法是执行nvidia-smi并查看使用了多少内存。由于时不时地这样做很无聊,我通常会在我的Linux机器上观看nvidia-smi。在我的MAC中,我没有安装NVIDIA GPU,所以我很少使用这些技巧。当我想,我会写这样的快速bash脚本

while true; do nvidia-smi; sleep 0.5; clear; done

您也可以在Mac中安装端口安装watch

另外,我最喜欢的两个工具是htop和dstat。

htop为Linux中著名的top命令提供了更好的图形界面。它为您提供有关内存和处理器使用情况以及不同进程的实时信息。如果您允许sudo访问htop,您可以直接从界面更改niceness和其他参数。

dstat为您提供有关I/O的实时信息。在大多数情况下,我将添加两个标志-d-n以仅指定磁盘和网络使用情况。

幸运的是,htop可以通过运行以下命令在Mac上安装:

brew install htop

另一方面,dstat不能直接使用。请查看ifstatistatat以了解类似的功能。

雍俊远
2023-03-14

您的乘法计算是正确的,但是,您处理的是百万字节而不是十亿字节。实际的需求是6400*100*4 100*1500*4,如果使用默认的Float32,应该是4 MB。您将两个后续层的层大小相乘,因为每个神经元都连接到后续层中的每个神经元。然后整个内存需求乘以批量大小。这就是为什么使用卷积层来训练深度网络。

对于gpu,我使用nvidia smi来监控linux上的内存需求。谷歌搜索给了我这个关于mac的信息:https://phvu.net/2015/03/30/nvidia-smi-on-macos/. 如果内存需求超过GPU内存,则无法在GPU上对其进行训练。您可以在cpu上训练它,但这需要很长时间。

使用大型训练集进行训练有多种方法。通常情况下,发电机用于批量培训。这意味着只加载您实际需要的部分训练集(https://keras.io/getting-started/faq/#how-can-i-use-keras-with-datasets-that-not-fit-in-memory)。

 类似资料:
  • 我在看http://cs231n.github.io/convolutional-networks/ 我不明白为什么第2层(CONV3-64:[224x224x64])的内存大小是224x224x64 我理解有64个3x3大小的过滤器,但为什么输入大小乘以64? 为什么层(CONV3-128)中的权重数是(3x3x64)x128而不是(3x3x64x64)x128?(前一层的权重乘以新的128个过

  • 本文向大家介绍PHP判断是否连接上网络的方法,包括了PHP判断是否连接上网络的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP判断是否连接上网络的方法。分享给大家供大家参考。具体实现方法如下: 首先写个函数 接着在需要的地方直接调用即可 希望本文所述对大家的php程序设计有所帮助。

  • 内存不足,Java运行时环境无法继续。 本机内存分配(mmap)无法映射1366294528字节以提交保留内存。包含更多信息的错误报告文件保存为://hs_err_pid5.log

  • 神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为

  • 译者:bat67 最新版会在译者仓库首先同步。 可以使用torch.nn包来构建神经网络. 我们以及介绍了autograd,nn包依赖于autograd包来定义模型并对它们求导。一个nn.Module包含各个层和一个forward(input)方法,该方法返回output。 例如,下面这个神经网络可以对数字进行分类: 这是一个简单的前馈神经网络(feed-forward network)。它接受一

  • 我用newff在Matlab中创建了一个用于手写数字识别的神经网络。 我只是训练它只识别0 输入层有9个神经元,隐层有5个神经元,输出层有1个神经元,共有9个输入。 我的赔率是0.1 我在Matlab中进行了测试,网络运行良好。现在我想用c语言创建这个网络,我编写了代码并复制了所有的权重和偏差(总共146个权重)。但当我将相同的输入数据输入到网络时,输出值不正确。 你们谁能给我指点路吗? 这是我的