2013-03-06 15 views
5

Mam sieć neuronową z architekturą 1024, 512, 256, 1 (warstwa wejściowa ma jednostki 1024, warstwa wyjściowa ma jednostkę 1 itd.). Chciałbym wyszkolić tę sieć za pomocą jednego z algorytmów optymalizacji w scipy.optimize.Rozwiązywanie problemów z pamięcią w sieci o wielu masach

Problem polega na tym, że algorytmy te oczekują podania parametrów funkcji w jednym wektorze; Oznacza to, że w moim przypadku, muszę rozwinąć wszystkie ciężary w wektorze długości

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

Niektóre algorytmy (jak fmin_bfgs) trzeba użyć macierzy tożsamości, a więc wykonać połączenie jak

I = numpy.eye(655616) 

co, niezbyt zaskakująco, produkuje MemoryError. Czy jest jakiś sposób, aby uniknąć konieczności rozwijania wszystkich wag w jednym wektorze, skoro nie dostosowuję algorytmów do moich własnych potrzeb?

+0

Wow, to dużo ciężarów, które pasują. (+1) – NPE

+0

@NPE Muszę przyznać, że tak naprawdę nie wiem, co robię. Szkolę się na obrazach o rozmiarze 32x32. Czy mogę sprawić, by obrazy były jeszcze mniejsze? –

+0

Ponownie, zmniejszając rozmiar obrazów do '16x16' i używając architektury' 256, 128, 1', nadal miałbym i rozwinęłam wektor wagowy o długości '32896'. –

Odpowiedz

0

Myślę, że mapowanie pamięci z rozwiązaniem problemu. Sugeruję użycie numpy.memmap, która jest zoptymalizowana pod kątem numpy tablic. Pamiętaj, że chociaż mapowanie pamięci może być szybkie, powinieneś mieć oko na thrashing.

Dla ogólnej kultury, moduł mmap jest bardziej uniwersalną biblioteką mapowania pamięci, która jest zawarta w bibliotece standardowej.

1

Nie należy próbować dopasowywać ciężarów do NN za pomocą L-BFGS. Nie działa to szczególnie dobrze (patrz wczesne prace Yann LeCun), a ponieważ jest to metoda drugiego rzędu, będziesz starał się zbliżyć do heskiego, który dla tej liczby wag jest macierzą 655,000 x 650,000: to wprowadza ogólne obciążenie, które po prostu nie będzie uzasadnione.

Sieć nie jest głęboka: czy istnieje powód, dla którego unikasz standardowego back-propu? Jest to po prostu pochylenie gradientowe, jeśli masz dostęp do implementacji biblioteki, gradienty są tanie do obliczenia, a ponieważ jest to tylko metoda pierwszego rzędu, nie będziesz mieć takiej samej wydajności.

Edycja:

Backpropogation oznacza, że ​​zasada aktualizacji dla w_i kroku t wynosi:

w_i (t) = w_i (f-1) - \ alfa (dError/dw_i)

Ponadto znalazłeś przyczynę, dla której ludzie w wizji często używają Convolutional NNs: rzadka łączność znacząco zmniejsza rozmiar wektora wagowego, w którym masz jeden neuron na piksel.

+0

+1 Za wskazanie, że problem z pamięcią jest spowodowany przez Hesjan. Nie unikam standardowego backprop, używam backprop do obliczenia gradientu błędu wrt. masy sieci. Nadal potrzebuję algorytmu optymalizacji, który może przemierzać powierzchnię błędu (używając gradientu obliczonego przy użyciu backprop), aby znaleźć jego minimalne wartości. –

+0

Backprop, przynajmniej tak jak ja bym użył tego terminu, oznacza użycie gradientowego zejścia.Możesz to zrobić stochastycznie (każdy z kolei) lub w partiach. To znaczy. twoja aktualizacja to wielkość kroku pomnożona przez ujemną wartość gradientu. –

+0

Zmieniono moją odpowiedź, ponieważ przydarzyło mi się inne przydatne przysmak: z tego powodu używane są splotowe sieci. –

Powiązane problemy