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

苏赞·乔科(Suzan Cioc)

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

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数据点吗?如果这样做,您可能会考虑投资专用解决方案(例如高性能服务器)来执行计算。如果不是您而是只有您自己,则必须查看数据集并开始分析哪些功能可能是不必要的,以减少列,最重要的是,哪些样本可能是不必要的,以减少行。

保持乐观

附带说明一下,您没有抱怨过OutOfMemoryMATLAB的任何错误,这可能是一个好兆头。也许您的机器只是挂起了,因为计算量很大。这也是一个合理的假设,因为您正在创建带有128隐藏层,62输出并运行多个训练时期的网络

杀死JVM

您可以采取的措施是在没有Java环境(JVM)的情况下运行MATLAB,以减轻机器的负担。这样可以确保MATLAB本身所需的内存更少。可以通过运行以下命令禁用JVM:

matlab -nojvm

如果您不需要显示任何图形,这将起作用,因为MATLAB将在类似控制台的环境中运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Matlab中逐步训练神经网络?并反复组合它们

如何在keras中同时训练多个神经网络?

如何查看训练样本我的神经网络在python张量流中错了

如何在Matlab中实现多层神经网络?

如何在MATLAB中将测试样本提供给神经网络?

MATLAB 中的神经网络在训练中失败

如何在MATLAB中将训练神经网络编译为独立应用程序?

在训练和预测过程中,我应该如何处理神经网络中的可变样本长度?

在keras中的CPU上并行训练多个神经网络

神经网络样本

如何在用 Keras 构建和训练的神经网络中处理错误预测?

预训练如何改善神经网络中的分类?

神经网络训练

如何正确训练我的神经网络

如何只训练神经网络的前端?

在训练神经网络中改组数据

如何在神经网络Matlab中将训练数据制作成4D数组-输入数据的正确方法

Matlab:如何在神经网络中使用.dat文件?

如何在Matlab中以最佳验证精度将卷积神经网络还原为迭代

如何在Matlab的神经网络中改善数字识别预测?

如何在MATLAB中验证概率神经网络给出的输出?

如何在神经网络(MATLAB)中对输出进行归一化?

Matlab:如何在神经网络中禁用验证和测试数据集

测试训练有素的神经网络-Matlab

神经网络偏差训练

神经网络的再训练

神经网络在线训练

卷积神经网络在火炬中。训练网络时出错

MATLAB神经网络:它是如何工作的?