我正在尝试学习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。 以及如何解决它。
答案 0 :(得分:0)
这可能是由于以下几点的结合:
进入隐藏层的神经元数量相当大......你确定300个特征/神经元是你需要的吗?考虑将问题分解为更少的特征......降维可能是富有成效的,但我只是在猜测。然而,据我所知,300个隐藏神经元的神经网络从经验来看应该没问题,但我只是提出了这一点,因为隐藏的神经元大小相当大。
您有太多输入用于培训。你有2040分,也许这就是为什么它会破裂。尝试将数据集拆分为给定大小的块,然后逐步训练每个块的网络。
让我们假设您无法修复第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,每次提供新的输入样本时参数都会更新。