我正在尝试在大型训练集上训练神经网络。
inputs
由大约4百万列和128行targets
组成,并由62行组成。
hiddenLayerSize
是128。
脚本如下:
net = patternnet(hiddenLayerSize);
net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
net.outputs{2}.processFcns = {'removeconstantrows','mapminmax'};
net.divideFcn = 'dividerand'; % Divide data randomly
net.divideMode = 'sample'; % Divide up every sample
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
net.trainFcn = 'trainbfg';
net.performFcn = 'mse'; % Mean squared error
net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
'plotregression', 'plotfit'};
net.trainParam.show = 1;
net.trainParam.showCommandLine = 1;
[net,tr] = train(net,inputs,targets, 'showResources', 'yes', 'reduction', 10);
当train
开始执行时,Matlab挂起,Windows挂起或运行缓慢,交换将导致大量磁盘运行,数十分钟之内什么也没有发生。
电脑是12Gb Windows x64,Matlab也是64位。进程管理器中的内存使用情况在操作过程中会有所不同。
除了减少火车行驶次数,还能做些什么?
如果减少火车组,那么到哪个水平?除了尝试外,如何估计它的大小?
为什么功能不显示任何内容?
从远程诊断此类问题相当困难,以至于我什至不确定任何人都能回答的问题是否真的有帮助。此外,您会一并提出几个问题,所以我将逐步解决。最终,我将尝试使您更好地了解脚本的内存消耗。
从要加载到内存中的数据集的大小开始,假设每个条目都包含一个双浮点精度数字,则您的训练数据集需要(4e6 * 128 * 8) Bytes
的内存大致可解析为3.81 GB
。如果我理解正确,则您的输出数组包含的(4e6 * 62)
条目(4e6 * 62 * 8) Bytes
大致等于1,15 GB
。因此,即使在进行网络培训之前,您仍在消耗5GB
内存。
现在是的,MATLAB使用延迟复制,因此任何赋值都可以:
training = zeros(4e6, 128);
copy1 = training;
copy2 = training;
不需要新的内存。但是,任何切片操作:
training = zeros(4e6, 128);
part1 = training(1:1000, :);
part1 = training(1001:2000, :);
确实会分配更多的内存。因此,在选择训练,验证和测试子集时:
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
在内部,该train()
功能可能会重新分配相同数量的内存两次。您的总计现在为10GB。如果现在您认为操作系统以及其他许多应用程序正在运行,则很容易理解为什么所有内容突然变慢。我可能会在这里告诉您一些明显的事情,但是:您的数据集非常大。
现在,尽管我很确定自己的5 GB
消费量计算,但是我不确定这是否是一个有效的假设。底线是我不太了解该train()
函数的内部工作原理。这就是为什么我敦促您使用MATLAB自己的探查器对其进行测试。实际上,这将使您更好地了解函数调用和内存消耗。
如何减少内存消耗?现在,这可能是自从黎明以来一直困扰着程序员的问题。:)再次,很难提供唯一的答案,因为解决方案通常取决于手头的任务,问题和工具。Matlab提供了一个令人疑问的好处,即有关如何减少内存使用的信息量丰富的页面。尽管问题经常出在要加载到内存中的数据大小上。
一方面,我当然首先要减少数据集的大小。您真的需要4e6 * 128
数据点吗?如果这样做,您可能会考虑投资专用解决方案(例如高性能服务器)来执行计算。如果不是您而是只有您自己,则必须查看数据集并开始分析哪些功能可能是不必要的,以减少列,最重要的是,哪些样本可能是不必要的,以减少行。
附带说明一下,您没有抱怨过OutOfMemory
MATLAB的任何错误,这可能是一个好兆头。也许您的机器只是挂起了,因为计算量很大。这也是一个合理的假设,因为您正在创建带有128
隐藏层,62
输出并运行多个训练时期的网络。
您可以采取的措施是在没有Java环境(JVM)的情况下运行MATLAB,以减轻机器的负担。这样可以确保MATLAB本身所需的内存更少。可以通过运行以下命令禁用JVM:
matlab -nojvm
如果您不需要显示任何图形,这将起作用,因为MATLAB将在类似控制台的环境中运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句