【问题标题】:How to train neural networks on big sample sets in Matlab?如何在 Matlab 中的大样本集上训练神经网络?
【发布时间】:2014-09-29 07:20:47
【问题描述】:

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

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

除了减少train set还能做什么?

如果减少列车组,那么到哪个级别?除了尝试,如何估计它的大小?

为什么函数不显示任何东西?

【问题讨论】:

    标签: matlab neural-network bigdata


    【解决方案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。如果您现在考虑您的操作系统正在运行,以及一堆其他应用程序,那么很容易理解为什么一切都突然变慢了。我可能会在这里告诉您一些显而易见的事情,但是:您的数据集非常很大。

    分析帮助

    现在,虽然我很确定我的 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 将在类似控制台的环境中运行。

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 2015-08-13
      • 2014-02-06
      • 2012-03-15
      • 2013-07-11
      • 1970-01-01
      • 2012-12-04
      • 2017-08-18
      相关资源
      最近更新 更多