3

Пытается подготовить классификатор с повторяющимся слоем, используя множество данных. В результате все данные не могут вписаться в память. Это дает мне следующее сообщение об ошибке:Как я могу обучить нейронную сеть большим количеством данных, чем может поместиться в память?

Error using zeros 
Requested 1x2114046976 (15.8GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long 
time and cause MATLAB to become unresponsive. See array size limit or preference panel for more information. 
Error in nnMex.perfsGrad (line 3) 
TEMP = zeros(1,ceil(hints.tempSizeBG/8)*8); 
Error in nnCalcLib/perfsGrad (line 294) 
       lib.calcMode.perfsGrad(calcNet,lib.calcData,lib.calcHints); 
Error in trainscg>initializeTraining (line 153) 
[worker.perf,worker.vperf,worker.tperf,worker.gWB,worker.gradient] = calcLib.perfsGrad(calcNet); 
Error in nnet.train.trainNetwork>trainNetworkInMainThread (line 28) 
worker = localFcns.initializeTraining(archNet,calcLib,calcNet,tr); 
Error in nnet.train.trainNetwork (line 16) 
    [archNet,tr] = trainNetworkInMainThread(archNet,rawData,calcLib,calcNet,tr,feedback,localFcns); 
Error in trainscg>train_network (line 147) 
[archNet,tr] = nnet.train.trainNetwork(archNet,rawData,calcLib,calcNet,tr,localfunctions); 
Error in trainscg (line 59) 
      [out1,out2] = train_network(varargin{2:end}); 
Error in network/train (line 369) 
    [net,tr] = feval(trainFcn,'apply',net,data,calcLib,calcNet,tr); 

Следует отметить, что в настоящее время моего вклад обучения 11x52266 и сеть имеет ~ 3k элементы веса из-за очередной слой. Я бы хотел, однако, предоставить в 15 раз больше данных для обучения.

Как я могу справиться? Существуют ли какие-либо методы для сопоставления локальной переменной, которую она пытается инициализировать на моем SSD вместо памяти?

Существует вариант «сокращения» для обучения, но, похоже, он не имеет никакого отношения к этому вопросу. Такая же ошибка возникает независимо.

+1

Отказ от ответственности: я не являюсь пользователем Matlab: Является ли ваш размер 11 или 52266? (на мой взгляд, обычный формат - это образцы X-функций). Почему некоторый внутренний массив растет вместе с продуктом ваших данных и весами (это не имеет для меня смысла, размеры сети/данные не зависят от выборки -size (за исключением размера пакета), возможно, это возможно, если используется внутренний алгоритм с полным пакетом = полный градиент, чем LBGFS, но это сделает невозможным такой размер данных, вам нужны методы на основе SGD)? Хорошо разработанные библиотеки поддерживают некоторый метод fit_on_batch (не уверен, что поддерживает ваша библиотека). – sascha

+0

И стратегия использования SSD вместо RAM не кажется многообещающей. Это трудно абстрагироваться внутренне, поэтому маловероятно, что ваше программное обеспечение поддерживает его. И это было бы слишком медленно, я думаю. (и я все еще думаю, что здесь есть что-то другое, см. другой комментарий) – sascha

+0

@sascha Я согласен с вами в этом вопросе, но реализация нейронной сети Matlab поддерживает функции x samples. Ответ user20160 и мой комментарий могут прояснить и предложить решение, но Matlab имеет реализацию для: (следующий комментарий) –

ответ

2

В общем, если ваш набор данных слишком велик, чтобы вписаться в память, вам придется обрабатывать его в кусках. Для обучения крупным сетям типично использовать стохастический градиентный спуск (который требует только одновременного доступа к одной точке данных) или тренировку мини-экипажа (которая требует только доступа к точкам данных в мини-баре). Кроме того, что они требуют меньше памяти, эти методы также имеют тенденцию сходиться намного быстрее, чем спуск градиента партии (который использует весь набор данных для каждого обновления веса). Диск медленный, поэтому, хотя для каждого обновления требуется только несколько точек данных, вы должны загружать столько очков, сколько сможете, затем разделяйте их на мини-кавычки и т. Д. Существуют и другие трюки, которые вы можете играть, чтобы уменьшить количество дисков читает, как выполнение нескольких обновлений перед загрузкой следующего набора данных.

Другой момент относится к рекуррентным нейронным сетям (RNN). Когда вы тренируете RNN с использованием backpropagation через время (BPTT), сеть должна быть «разворачивается» вовремя и рассматривается как очень глубокая прямая сеть с копией повторяющегося уровня на каждом временном шаге. Это означает, что выполнение BPTT в течение более длинных периодов времени требует большего объема памяти (и больше времени вычисления). Решением является использование усеченного BPTT, где градиент распространяется только на фиксированное количество шагов времени.

+0

Спасибо, @ user20160.Кажется, мне нужно будет обрабатывать данные в кусках, при этом стратегия выбирает мини-пакетную продолжительность M (для обучения последовательностей), а затем N мини-партий в куске, да? Matlab должен поддерживать это. [http://stackoverflow.com/questions/17628280/how-to-train-neural-network-incrementally-in-matlab?rq=1] Кажется, что Matlab не поддерживает SGD для обучения (в настоящее время используется SCG; масштабированный сопряженный градиент). Было предложено использовать устойчивое backpropagation - RP - это необходимо для обучения в мини-баре? –

+1

Если ваши данные являются последовательностями, вы загрузите фрагмент данных в память, содержащий некоторое количество мини-абзацев. Каждая мини-камера будет содержать несколько последовательностей. Если мини-блок содержит одну последовательность, то вы делаете SGD. Конъюгатные градиентные методы обычно работают в пакетном режиме. Там может быть способ использовать его с большими мини-отсеками, но вам придется внимательно изучить его. Не могу прокомментировать, был ли Rprop хорошим или нет, но это, конечно, не * необходимо * использовать. – user20160

+0

Я могу сделать каждый мини-пакет 1 полной последовательностью, а затем каждая партия будет несколько мини-партий. Думаю, мне понадобится количество образцов, скажем, I = (количество задержек времени в сети), чтобы начать каждую мини-партию, где ошибка не оценивается? –

Смежные вопросы