为什么Matlab需要如此巨大的内存?

时间:2015-09-25 12:07:19

标签: matlab memory machine-learning neural-network

我正在尝试学习289x300x1的神经网络。例如。输入向量是289个元素,300个隐藏神经元,1个类输出。

所以

net = feedforwardnet(300);
net = train(net,X,y,'useParallel','yes','showResources','yes');

给出错误

  

使用nn7 / perfsJEJJ时出错> calc_Y_trainPerfJeJJ(第37行)错误   在worker 2上检测到请求的87301x87301(56.8GB)数组超出   最大数组大小首选项。

X 是一个大小为289x2040的数组,元素类型是double。 y 是一个大小为1x2040的数组,elemetns的类型是double。

我不明白为什么matlab需要这么多内存来完成这么小的任务。需要存储权重= 289 * 300 * 64字节,约为5.5 MB。 以及如何解决它。

1 个答案:

答案 0 :(得分:0)

这可能是由于以下几点的结合:

  1. 进入隐藏层的神经元数量相当大......你确定300个特征/神经元是你需要的吗?考虑将问题分解为更少的特征......降维可能是富有成效的,但我只是在猜测。然而,据我所知,300个隐藏神经元的神经网络从经验来看应该没问题,但我只是提出了这一点,因为隐藏的神经元大小相当大。

  2. 您有太多输入用于培训。你有2040分,也许这就是为什么它会破裂。尝试将数据集拆分为给定大小的块,然后逐步训练每个块的网络。

  3. 让我们假设您无法修复第1点,但您可以解决第2点问题,我想到这样的事情:

    chunk_size = 200; %// Declare chunk size
    num_chunks = ceil(size(X,2)/chunk_size); %// Get total number of chunks
    net = feedforwardnet(300); %// Initialize NN
    
    %// For each chunk, extract out a section of the data, then train the
    %// network.  Retrain on original network until we run out of data to train
    for ii = 1 : num_chunks
        %// Ensure cap off if we get to the chunk at the end that isn't
        %// evenly divisible by the chunk size
        if ii*chunk_size > size(X,2)
            max_val = size(X,2);
        else
            max_val = ii*chunk_size;
        end
    
        %// Specify portion of data to extract
        interval = (ii-1)*chunk_size + 1 : max_val;
    
        %// Train the NN on this data
        net = train(net, X(:,interval), y(interval),'useParallel','yes','showResources','yes'));
    end
    

    因此,将数据分解为块,分别训练每个块上的神经网络,并随时更新神经网络。您可以这样做,因为神经网络基本上实现Stochastic Gradient Descent,每次提供新的输入样本时参数都会更新。