Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.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_Machine Learning_Deep Learning_Computer Vision_Conv Neural Network - Fatal编程技术网

Python 卷积神经网络内存使用

Python 卷积神经网络内存使用,python,machine-learning,deep-learning,computer-vision,conv-neural-network,Python,Machine Learning,Deep Learning,Computer Vision,Conv Neural Network,我正在实施一个CNN。假设有1000000个培训示例,我的一个层的维度是20x30x30 现在假设我必须计算这些例子的训练精度。然后,在前向传播中,我需要为该层存储1000000x20x30x30=180亿个值,这占用了太多的内存。另一方面,如果我分别对每个训练示例进行前向传播,则会花费太长时间 我只是想知道如何解决这个问题 非常感谢你所做的一切 这里遇到的问题通常通过批处理解决(如评论中所述)。 您只需对数据点的子集进行采样,然后在仅查看这些示例后更新权重,而不是通过所有训练示例进行传递 与普

我正在实施一个CNN。假设有1000000个培训示例,我的一个层的维度是20x30x30

现在假设我必须计算这些例子的训练精度。然后,在前向传播中,我需要为该层存储1000000x20x30x30=180亿个值,这占用了太多的内存。另一方面,如果我分别对每个训练示例进行前向传播,则会花费太长时间

我只是想知道如何解决这个问题


非常感谢你所做的一切

这里遇到的问题通常通过批处理解决(如评论中所述)。
您只需对数据点的子集进行采样,然后在仅查看这些示例后更新权重,而不是通过所有训练示例进行传递
与普通的“梯度下降”(GD)相比,它的名称是“随机梯度下降”(SGD)。随机性来自使用随机子样本(通常是2的一些幂,即4、8、16、32等)。 现在,我们不是简单地进行迭代,而是在一个历元(通过所有的训练数据)和一个简单的迭代(简单地使用
batch\u size
元素)之间进行区分

这也回答了您在评论中提出的部分问题(“为什么一次提供更多图像更有效?”): 由于您在每个批处理之后更新权重(因此必须通过网络计算反向传播),因此需要更长的时间才能到达下一个正向传递

一般来说,SGD也更倾向于获得更好的收敛性。在实践中,采取许多小步骤可能会比采取一个大步骤产生更好的结果。有关更多参考信息,请参阅中的最后几张幻灯片


由于您担心这需要很长时间:SGD的批量大小合适(我个人甚至不会超过每批2^10个样本;有几篇论文“设定了大约128个样本的标准”)可以很快获得良好的结果/收敛。为了可能更快的收敛,您牺牲了单个迭代的速度。

您在这里遇到的问题通常是通过批处理解决的(如评论中所述)。
您只需对数据点的子集进行采样,然后在仅查看这些示例后更新权重,而不是通过所有训练示例进行传递
与普通的“梯度下降”(GD)相比,它的名称是“随机梯度下降”(SGD)。随机性来自使用随机子样本(通常是2的一些幂,即4、8、16、32等)。 现在,我们不是简单地进行迭代,而是在一个历元(通过所有的训练数据)和一个简单的迭代(简单地使用
batch\u size
元素)之间进行区分

这也回答了您在评论中提出的部分问题(“为什么一次提供更多图像更有效?”): 由于您在每个批处理之后更新权重(因此必须通过网络计算反向传播),因此需要更长的时间才能到达下一个正向传递

一般来说,SGD也更倾向于获得更好的收敛性。在实践中,采取许多小步骤可能会比采取一个大步骤产生更好的结果。有关更多参考信息,请参阅中的最后几张幻灯片


由于您担心这需要很长时间:SGD的批量大小合适(我个人甚至不会超过每批2^10个样本;有几篇论文“设定了大约128个样本的标准”)可以很快获得良好的结果/收敛。你牺牲了单个迭代的速度来换取可能更快的收敛。

欢迎来到计算的中心困境:时间-内存权衡。在这种情况下,改进一个通常意味着牺牲另一个;改进它的最好方法是找到一个完全独立的方法,该方法具有更好的平衡性,或者提高一个组件的效率。不知道这是否可能,不过,我想我会插话。需要更多关于您的框架、代码、设置等的详细信息,但一般来说,您应该将您的培训示例拆分为-您肯定不想在您使用的任何框架中初始化100000x0x30x30张量。改变批量大小通常在时间和内存之间进行权衡-一次输入更多图像可以让你的神经网络框架进行更多不间断的计算,而代价是需要在内存中存储更多图像和中间层。我尝试将训练示例分为批,效果更好,谢谢你的帮助!我想知道,为什么一次输入更多的图像比在每个训练示例上运行正向传播要有效得多?为什么不间断的计算会产生如此巨大的差异?因为最终,计算结果是一样的。再次感谢你!欢迎来到计算的中心困境:时间-内存权衡。在这种情况下,改进一个通常意味着牺牲另一个;改进它的最好方法是找到一个完全独立的方法,该方法具有更好的平衡性,或者提高一个组件的效率。不知道这是否可能,不过,我想我会插话。需要更多关于您的框架、代码、设置等的详细信息,但一般来说,您应该将您的培训示例拆分为-您肯定不想在您使用的任何框架中初始化100000x0x30x30张量。改变批量大小通常在时间和内存之间进行权衡-一次输入更多图像可以让你的神经网络框架进行更多不间断的计算,而代价是需要在内存中存储更多图像和中间层。我尝试将训练示例分为批,效果更好,谢谢你的帮助!我想知道,为什么一次输入更多的图像会显著提高效率