Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我们如何大致计算运行一个程序需要多少内存?_Python_Tensorflow_Memory_Memory Management - Fatal编程技术网

Python 我们如何大致计算运行一个程序需要多少内存?

Python 我们如何大致计算运行一个程序需要多少内存?,python,tensorflow,memory,memory-management,Python,Tensorflow,Memory,Memory Management,今天我尝试在Tensorflow中实现一个对象检测API。在完成培训过程后,我尝试运行程序来检测网络摄像头中的对象。当我运行它时,终端中打印了以下消息: 分配器(GPU\U 0\U bfc)试图分配2.05GiB时内存不足 通过_计数释放_=0。调用者指出这不是一个 失败,但这可能意味着如果更多 内存可用 由于性能问题,我似乎得到了很多误报 我们如何事先计算运行该程序或任何程序所需的内存 我不是问它使用了多少内存,我们可以找到。我正在使用Python。在对象检测中,使用的大多数层都是CNN,下面

今天我尝试在Tensorflow中实现一个对象检测API。在完成培训过程后,我尝试运行程序来检测网络摄像头中的对象。当我运行它时,终端中打印了以下消息:

分配器(GPU\U 0\U bfc)试图分配2.05GiB时内存不足 通过_计数释放_=0。调用者指出这不是一个 失败,但这可能意味着如果更多 内存可用

由于性能问题,我似乎得到了很多误报

我们如何事先计算运行该程序或任何程序所需的内存


我不是问它使用了多少内存,我们可以找到。我正在使用Python。

在对象检测中,使用的大多数层都是CNN,下面解释CNN的内存消耗计算。对于模型的其他层,可以采用相同的方法

比如说,, 考虑具有5×5滤波器的卷积层,输出200 尺寸为150×100的特征地图,带有步幅1和相同的填充。如果 输入为150×100 RGB图像(三通道),然后输入 参数为(5×5×3+1)×200 =15200(+1对应于偏置项),这与完全连接的层相比相当小。7但是,200个特征中的每一个 地图包含150×100个神经元,每个神经元都需要 计算其5×5×3=75个输入的加权和:总共是 2.25亿次浮点乘法。没有完全连接的网络那么糟糕 层,但仍然需要大量计算。此外,如果 特征映射使用32位浮点表示,然后 卷积层的输出将占据200×150×100×32=96 100万位(约11.4 MB)的RAM.8,这只是一个 实例!如果一个训练批包含100个实例,则该层 将使用超过1 GB的RAM

有关内存消耗的更多信息,请参见以下问题和相应的答案:

问题

考虑一个由三个卷积层组成的CNN,每个卷积层有3×3 果仁,步幅为2,填充相同。最低层输出100 特征映射,中间的一个输出200,顶部的一个输出400。 输入图像为200×300像素的RGB图像。总数是多少 CNN中的参数数量?如果我们使用32位浮点,至少 进行预测时,该网络至少需要多少RAM 就一个例子?在50人的小批量训练中,情况如何 图像

答案如下所述

让我们计算一下CNN有多少个参数。自从第一次 卷积层有3×3个核,输入有三个核 通道(红色、绿色和蓝色),则每个特征贴图具有3×3×3 权重,加上偏差项。即每个特征图有28个参数。 因为第一个卷积层有100个特征映射,所以它有一个 共有2800个参数。第二卷积层为3×3 内核,其输入是上一个版本的100个特征映射集 层,因此每个特征贴图都有3×3×100=900个权重,加上一个偏差 学期由于该层有200个要素图,因此该层有901×200个要素图= 180200个参数。最后,第三层也是最后一层卷积层 也有3×3个内核,其输入是一组200个特征映射 上一层的,因此每个要素地图有3×3×200=1800 权重,加上偏差项。由于它有400个要素地图,该图层 总面积为1801×400 =720400个参数。总之,CNN有2800+180200+720400=903400个参数。现在让我们计算一下这个内存有多少 神经网络需要(至少)在预测某个时间点时 单一实例。首先,让我们计算每个元素的特征贴图大小 层。因为我们使用的是2的步幅和相同的填充,所以 要素图的水平和垂直尺寸在以下位置除以2: 每层(必要时向上舍入),以便输入通道 200×300像素,第一层特征图为100×150,第二层 第二层的特征映射为50×75,第三层的特征映射为50×75 地图是25×38。因为32位是4字节,第一个卷积 图层有100个要素地图,第一个图层占4 x 100×150×100 100=600万字节(考虑到1MB=1024KB,大约为5.7MB 和1KB =1024字节)。第二层占用4×50×75×200=300万字节(约2.9 MB)。最后,第三层占4×25 ×38×400=1520000字节(约1.4MB)。但是,一旦一个层 通过计算,前一层占用的内存可以 发布了,所以如果一切都得到了很好的优化,只有6+9=1500万 需要字节(约14.3MB)的RAM(当第二层 已计算,但第一层占用的内存为 尚未发布)。但是等等,您还需要添加占用的内存 根据CNN的参数。我们早些时候计算过它有903400个 参数,每个参数最多使用4个字节,因此这将添加3613600个字节(大约 3.4 MB)。所需的总RAM(至少)为18613600字节(约17.8 MB)


有关更多信息,请参阅《使用Scikit学习和Tensorflow进行机器学习》(PDF可在线获得)一书“第13章,卷积神经网络”的“内存要求”部分。

您是否询问在一般情况下预测随机程序的内存要求,没有关于它的任何附加信息?或者您对运行TensorFlow(给定特定网络)的内存需求特别感兴趣吗?后者!:)