如何在Matlab中训练大样本集上的神经网络?

时间:2014-08-06 11:18:17

标签: matlab neural-network bigdata

我正在尝试在大型训练集上训练神经网络。

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位。进程管理器中的内存使用量在运行期间会有所不同。

除了减少训练集之外还能做些什么?

如果减少列车设置,那么到哪个级别?除了尝试之外,如何估算它的大小?

为什么不显示任何功能?

1 个答案:

答案 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输出并运行几个训练时期的网络,正如您应该做的那样。

杀死JVM

如何在机器上减少负载是在没有Java环境(JVM)的情况下运行MATLAB。这确保了MATLAB本身将需要更少的内存来运行。可以通过运行以下命令禁用JVM:

matlab -nojvm

如果你不需要显示任何图形,这是有效的,因为MATLAB将在类似控制台的环境中运行。