【发布时间】:2014-07-08 16:44:34
【问题描述】:
我必须使用 Neural Network Toolbox 的 400*60000 矩阵(在 64 位 8gb ram 机器上)使用 processpca (讲座练习,我认为这里无法使用替代方案)计算 pca。错误信息是:
Error using eye
Out of memory. Type HELP MEMORY for your options.
Error in processpca.create (line 15)
settings.transform = eye(R);
Error in processpca (line 60)
[y,settings] = processpca.create(x,param);
Error in pca (line 21)
[trainDataPCA,psPCA] = processpca(trainData);
我的代码是:
% PCA - Reduce feature dimensions to selected dimensions
function [trainDataPCA,trainLabelsPCA] = pca(trainData, trainLabels, nDim)
if nargin < 3
print "Exact three arguments needed"
return
end
% Reduce nDim to max size of input data
nDimIn = size(trainData,1);
nDimOut = min(nDim,nDimIn);
% Normalise feature - standard deviation 1, mean 0
trainData = trainData';
trainLabels = trainLabels';
[trainData,trainPS] = mapstd(trainData);
% Calculate PCA
[trainDataPCA,psPCA] = processpca(trainData);
trainDataPCA = trainDataPCA(:,1:nDimOut);
% Map PCA to labels
trainLabelsPCA = processpca('apply',trainLabels,psPCA);
trainLabelsPCA = trainLabelsPCA(:,1:nDimOut);
trainDataPCA = trainDataPCA';
trainLabelsPCA = trainLabelsPCA';
在这种情况下我该怎么办?
编辑:我的记忆:
Maximum possible array: 9861 MB (1.034e+10 bytes) *
Memory available for all arrays: 9861 MB (1.034e+10 bytes) *
Memory used by MATLAB: 680 MB (7.128e+08 bytes)
Physical Memory (RAM): 8187 MB (8.585e+09 bytes)
* Limited by System Memory (physical + swap file) available.
【问题讨论】:
-
400 x 60000是一个相当大的矩阵,如果它是full。看起来当您使用processpca时,它还在尝试分配与400 x 60000相同大小的矩阵,然后再继续训练您的数据。您将很快耗尽内存。您可以做的一件事是尝试增加 Java 堆大小。这是在黑暗中拍摄,但它可以工作:进入你的Preferences -> General -> Java Heap Memory。尽可能多地发挥它。 -
Mhh 将堆内存设置为 2046,但这并没有帮助。该矩阵有 60000 个数字的 400 个灰度值,从我的观点来看,其中有很多空值。我可以在这里优化一些东西吗?
-
您是否尝试过使用
sparse? mathworks.com/help/matlab/ref/sparse.html。拿你的矩阵做sparse(A);,A是你的矩阵。sparse用于表示具有许多零元素的矩阵。这可以为您节省一些内存。希望 NN Toolbox 也接受sparse矩阵作为有效输入。我很长时间没有使用 NN Toolbox,所以在这里我无法提供任何见解。顺便说一句,您是否使用 MNIST 数据库进行手数识别?他们的补丁是 20 x 20 和 60000 张测试图像,所以每张图像 400 像素看起来很熟悉。 -
不,还没有尝试过,感谢您的提示。是的,我正在使用 MNIST 数据库对使用神经网络的模式识别进行一些基本调查。
-
只是关于增加 Java 堆大小的简要说明;实际上,这会产生不利影响,因为它会为 Java 保留内存,而这会从可用于其他事物的总内存中拿走。在这种情况下,算法是在 MATLAB 而不是 Java 中实现的。事实上,它最终会调用完成大部分工作的
svd函数。阅读源代码,processpca的实现与我在这篇文章中展示的类似:stackoverflow.com/a/3181851
标签: matlab out-of-memory pca