2013-03-06 2 views
5

У меня есть нейронная сеть с архитектурой 1024, 512, 256, 1 (входной уровень имеет 1024 единиц, выходной уровень имеет 1 единиц и т. Д.). Я хотел бы обучить эту сеть, используя один из алгоритмов оптимизации в scipy.optimize.Работа с проблемами памяти в сети со многими весами

Проблема в том, что эти алгоритмы ожидают, что параметры функции будут заданы в одном векторе; это означает, что в моем случае, я должен разворачивать все веса в векторе длины

1024*512 + 512*256 + 256*1 = 655616 

Некоторые алгоритмы (как fmin_bfgs) необходимо использовать единичные матрицы, поэтому они делают вызов, как

I = numpy.eye(655616) 

который, не очень удивительно, производит MemoryError. Есть ли какой-то способ для меня избежать необходимости развернуть все веса в один вектор, не дожидаясь адаптации алгоритмов в scipy.optimize к моим собственным потребностям?

+0

Вау, это много весов, чтобы соответствовать. (+1) – NPE

+0

@NPE Я должен признать, что я действительно не знаю, что делаю. Я тренируюсь на изображениях размером 32x32. Должен ли я сделать изображения еще меньше? –

+0

Затем, уменьшив размер изображений до «16x16» и используя архитектуру «256, 128, 1', я бы все еще имел и развернул вектор веса длины« 32896 ». –

ответ

0

Я думаю, что сопоставление памяти с решением вашей проблемы. Я предлагаю использовать numpy.memmap, который оптимизирован для массивов numpy. Обратите внимание, что, хотя отображение памяти может быть довольно быстрым, вы должны следить за thrashing.

Для вашей общей культуры модуль mmap является более универсальной библиотекой памяти для отображения, которая включена в стандартную библиотеку.

1

Не пытайтесь установить весы в NN, используя L-BFGS. Это не работает особенно хорошо (см. Документы раннего Яна ЛеКуна), а потому, что это метод второго порядка, который вы собираетесь приблизить к гессианскому, который для этого большого веса составляет 655 000 х 650 000 матриц: это вводит которые просто не оправдаются.

Сеть не такая уж глубокая: есть ли причина, по которой вы избегаете стандартного back-prop? Это просто градиентный спуск, если у вас есть доступ к реализации библиотеки, градиенты дешевы для вычисления, и поскольку это только метод первого порядка, у вас не будет одинаковых накладных расходов.

РЕДАКТИРОВАТЬ:

Backpropogation означает, что правило обновления для w_i на этапе Т:

w_i (т) = w_i (т-1) - \ альфа (dError/dw_i)

Кроме того, вы столкнулись с тем, почему люди в зрении часто используют Convolutional NNs: разреженная связь значительно уменьшает размер вектора веса, где у вас есть один нейрон на пиксель.

+0

+1 За то, что проблема памяти вызвана гессианской. Я не избегаю стандартного backprop, я использую backprop для вычисления градиента ошибки wrt. веса сети. Мне все еще нужен алгоритм оптимизации, который может пересекать поверхность ошибки (используя градиент, рассчитанный с помощью backprop), чтобы найти его минимум. –

+0

Backprop, по крайней мере, поскольку я использовал бы этот термин, означает использование градиентного спуска.Вы можете делать это стохастически (каждый пример по очереди) или в партиях. То есть ваше обновление представляет собой размер шага, умноженный на отрицательный результат градиента. –

+0

Отредактировал мой ответ, потому что мне понадобился другой полезный лакомый кусочек: по этой причине используются сверточные сети. –

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