我正在尝试在大型训练集上训练神经网络。
inputs
包含大约400万列和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位。进程管理器中的内存使用量在运行期间会有所不同。
除了减少训练集之外还能做些什么?
如果减少列车设置,那么到哪个级别?除了尝试之外,如何估算它的大小?
为什么不显示任何功能?
答案 0 :(得分:1)
从远程诊断此类问题相当困难,以至于我甚至不确定任何人都能回答的问题可能实际上有所帮助。此外,你在一个问几个问题,所以我将逐步采取它。最后,我将尝试让您更好地了解脚本的内存消耗。
从您在内存中加载的数据集的大小开始,假设每个条目都包含双浮点精度数,您的训练数据集需要(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。如果您现在认为您的操作系统正在运行,以及一堆其他应用程序,很容易理解为什么一切都会突然变慢。我可能会告诉你一些显而易见的事情但是:你的数据集非常大。</ p>
现在,虽然我非常确定我的5 GB
消耗量计算,但我不确定这是否是一个有效的假设。底线是我不清楚train()
函数的内部工作原理。
这就是为什么我建议您使用MATLAB's very own profiler进行测试。这确实可以让您更好地理解函数调用和内存消耗。
可以采取哪些措施来减少内存消耗?现在这可能是自从时代开始以来困扰程序员的问题。 :)再一次,很难提供一个独特的答案,因为解决方案通常取决于手头的任务,问题和工具。 Matlab有一个让我们怀疑的问题,informative page如何减少内存使用。很多时候问题在于要加载到内存中的数据大小。
一方面,我当然会先减少数据集的大小。你真的需要4e6 * 128
数据点吗?如果您这样做,您可能会考虑投资专用解决方案,如高性能服务器来执行计算。如果不是你,只有你,必须查看你的数据集并开始分析可能不需要的功能,减少列,最重要的是,可能不需要哪些样本,以减少行。
在旁注中,您没有抱怨MATLAB中的任何OutOfMemory
错误,这可能是个好兆头。也许你的机器只是悬挂,因为计算是密集的。这也是一个合理的假设,因为您正在创建一个具有128
隐藏层,62
输出并运行几个训练时期的网络,正如您应该做的那样。
如何在机器上减少负载是在没有Java环境(JVM)的情况下运行MATLAB。这确保了MATLAB本身将需要更少的内存来运行。可以通过运行以下命令禁用JVM:
matlab -nojvm
如果你不需要显示任何图形,这是有效的,因为MATLAB将在类似控制台的环境中运行。