Seite 1 von 1
Memory Error
Verfasst: Donnerstag 22. September 2011, 16:45
von carrot
Hej!
Nach einiger Rumprobiererei bin ich nu doch recht ratlos.
Ich möchte ein array der Größe 17*17382 in ein Programm zur Mustererkennung einlesen.
Nach ewiger Ladezeit erhalte ich dann einen Memory Error:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Uni\Bachelorarbeit\Mustererkennung\Steine_real.py", line 5, in <module>
conec = mlgraph((17380,2700,2700,2))
File "C:\Python26\lib\site-packages\ffnet\ffnet.py", line 41, in mlgraph
conec.append((src, trg))
MemoryError
Am Arbeitspeicher kann es eigtl nicht liegen denk ich.. hab 8GB. Im Taskmanager kann man eine CPU-Auslastung von ca 25% ablesen udn der Arbeitsspeicher wird nur mit ca. 3GB genutzt.
Jemand nen Rat für mich?
Falls es hilft: Es geht darum ein neuronales Netz mit Trainingsdaten zu füttern.
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 16:58
von snafu
Naja, es kommt ja auch irgendwann drauf an, wieviel GB für den einzelnen Prozess möglich sind...
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:02
von gkuhl
Hi,
was macht denn die Funktion 'mlgraph', die die Exception wirft? Wenn (17380,2700,2700,2) der Shape eines Arrays ist, wären das mehr als 1 TB Daten bei 4 byte pro Element.
Grüße
Gerrit
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:10
von carrot
Die Funktion 'mlgraph' erzeugt ein neuronales Netz. In diesem Fall mit 17380 Inputs, 2 Layern zu je 2700 Hidden-Units und 2 Outputs. Die Anzahl der Inputs beruht auf der Zahl der Pixel meiner Bilder die ich eingelesen habe. 2 Outputs für "ja" und "nein" und die Werte für die Hidden-Units hab ich nun mal willkürlich gesetzt, aber mit sehr kleinen Werten hatte er mehr Probleme. Habs insgesamt nun aufs Minimum an Fehlermeldungen reduziert ;>
Ich arbeite hier im Übrigen mit der ffnet-Toolbox.
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:16
von gkuhl
@carrot: Quellcode?
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:20
von carrot
Code: Alles auswählen
# -*- coding: cp1252 -*-
from ffnet import ffnet, mlgraph, readdata
# Generate standard layered network architecture and create network
conec = mlgraph((17380,2700,2700,2))
net = ffnet(conec)
# Read data file
print "READING DATA..."
data = readdata( 'Trainingsdaten.dat', delimiter = ';' )
print data
input = data[:, :17380] #first 17380 columns - bitmap definition
target = data[:, 17380:] #the rest - 2 columns for "ja" o. "nein"
# Train network with scipy tnc optimizer - 16 lines used for training
print "TRAINING NETWORK..."
net.train_tnc(input[:15], target[:15], maxfun = 2000, messages=1)
# Test network - remaining lines used for testing
print
print "TESTING NETWORK..."
output, regression = net.test(input[15:], target[15:], iprint = 1)
try:
from pylab import *
from random import randint
digitpat = randint(58, 67) #Choose testing pattern to plot
subplot(211)
## imshow(input[digitpat].reshape(8,8), interpolation = 'nearest')
imshow(input[16].reshape(8,8), interpolation = 'nearest')
subplot(212)
N = 2 # number of digits / network
ind = arange(N) # the x locations for the groups
width = 0.10 # the width of the bars
## bar(ind, net(input[digitpat]), width, color='b') #make a plot
bar(ind, net(input[16]), width, color='g') #make a plot
xticks(ind+width/2., ('ja', 'nein',))
xlim(-width,N-width)
axhline(linewidth=1, color='black')
title("Das trainierte Netz schaezt")
xlabel("Stein")
ylabel("Network outputs")
show()
except ImportError, e:
print "Cannot make plots. For plotting install matplotlib.\n%s" % e
print \
"""
Note:
Normalization of input/output data is handled automatically in ffnet.
Just use your raw data both at trainig and recalling phase.
"""
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:29
von deets
Also ich wuerde jetzt einfach mal vermuten, dass dein multilayer-perzeptron einfach die Grenzen sprengt - dein "einlesen" tust du doch noch gar nix. Hast du 64-Bit Python, oder noch 32Bit?
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:32
von gkuhl
Da der MemoryError gleich in der zweiten Codezeile (conec = mlgraph((17380,2700,2700,2))) auftritt, hat das Problem nichts mit dem Einlesen der Daten zu tun, sondern tritt beim Initialisieren des neuronalen Netzes auf.
Ich habe leider keine Ahnung von neuronalen Netzen, aber "17380 Inputs, 2 Layern zu je 2700 Hidden-Units und 2 Outputs" sind vermutlich zu viele Informationen (siehe meine Rechnung oben) und passen damit nicht in einen "normalen" Arbeitsspeicher.
Willkommen in der Wissenschaft, wo Rechner grundsätzlich nicht genug Ressourcen haben.
Edit: deets war schneller.
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:49
von carrot
Hast du 64-Bit Python, oder noch 32Bit?
32-Bit

Python 2.6
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 17:53
von carrot
Hmm ich denke, dann werde ich mal meinen Datensatz komprimieren.
Ich danke euch soweit!
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 18:33
von deets
@gkuhl
Deine Rechnung stimmt zwar, aber sie berechnet ja eine Matrizengroesse, nicht unbedingt die eines ML-Perzeptrons.
Jedes Neuron einer tiefen Schicht ist ein Vektor mit so viel Gewichten wie der Layer davor. Muessten also
Code: Alles auswählen
>>> a = 17382
>>> b = 2700
>>> c = 2
>>> a * b + b * b + c * b
54226800
Das sind dann 54 millionen Gewichte. Pro Gewicht ein paar dutzend Bytes - da kommt man dann aber auch auf ein paar Gigs.
Re: Memory Error
Verfasst: Donnerstag 22. September 2011, 23:52
von carrot
Also ich bin grade dabei mit der Größe meiner Datensätze etwas rumzuspielen und mit kleineren funktioniert das Programm!
@deets:
Inwiefern spielt die Zahl der Hidden-Units eine Rolle, weißt du das?! Es scheint sich ja positiv auf die Datensatzgröße auszuwirken die Anzahl klein zu halten, aber was bedeutet das für mein Netz?!
Re: Memory Error
Verfasst: Freitag 23. September 2011, 08:56
von EyDu
carrot hat geschrieben:Also ich bin grade dabei mit der Größe meiner Datensätze etwas rumzuspielen und mit kleineren funktioniert das Programm!
@deets:
Inwiefern spielt die Zahl der Hidden-Units eine Rolle, weißt du das?! Es scheint sich ja positiv auf die Datensatzgröße auszuwirken die Anzahl klein zu halten, aber was bedeutet das für mein Netz?!
Dass die Anzahl der Hidden-Units entscheiden auf die Menge des benötigten Speichers auswirkt lässt sich ja ganz leicht berechnen, da jede Einheit mit jedem Element des Input Layers und des Output Layers verbunden ist.
In wie weit sich die größe des Hidden Layers auf das Ergebnis auswirkt, ist natürlich von der Komplexität der Aufgabe abhängig. Ein guter Indikator für zu viele Elemente in der Schicht ist, wenn sehr viele Gewichte den Wert 0, bzw. sehr nah an 0, angenommen haben. Bei zu wenigen Elementen kann das Netz das Problem nicht richtig abbilden und die Resultate werden eher schlecht sein.
Sebastian
Re: Memory Error
Verfasst: Freitag 23. September 2011, 12:10
von carrot
Mich würde noch interessieren, wo nun in meinem Fall genau die Grenze ist, sodass ich bei zu umfangreichen Datensätzen auf einen Memory Error stoße?
Ich habe folgende Python Version:
Python 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit (Intel)] on win32
Mein Rechner ist mit einem i5-460M und 8 GB DDR3 Memory ausgestattet und hat 64-bit Win7 installiert.
Liegt das Problem eher an dem Programm oder an meinem Rechner? Ich hätte nämlich die Möglichkeit an einem leistungsstärkeren Rechner zu arbeiten, aber würde das in meinem Fall überhaupt Sinn machen? Mein Rechner ist bei dem Python-Prozess ja nicht voll ausgelastet.
Re: Memory Error
Verfasst: Freitag 23. September 2011, 12:14
von deets
Wie schon erwaehnt - mit 32 Bit Python ist das eh egal. Dann gehen nicht mehr als 3 oder so GB an Speicher.
Re: Memory Error
Verfasst: Freitag 23. September 2011, 12:18
von carrot
Wie schon erwaehnt - mit 32 Bit Python ist das eh egal. Dann gehen nicht mehr als 3 oder so GB an Speicher.
Na bisher wurde ich nur gefragt was ich hab, welche Auswirkungen das hat, war mir aber noch nicht 100%ig klar.
Aber ja, das hab ich auch schon vermutet.
Re: Memory Error
Verfasst: Freitag 23. September 2011, 13:28
von snafu
Macht es möglicherweise Sinn, die Arbeit auf 2 Python-Prozesse aufzuteilen, die sich über eine Pipe informieren?
Re: Memory Error
Verfasst: Freitag 23. September 2011, 13:38
von deets
@snafu
Nicht wirklich. Wenn es nur um das Memory-Problem geht, dann sollte man das lieber mit 64 Bit Python loesen. Und ein feed-forward-Netz mit dem zum Training genutzen back-propagation-Algorithmus auf zwei Prozesse zu verteilen ist alles andere als trivial.
Da waere dann eher eine kompaktere, weil auf C basierende Implementation, unter Umstaenden mit reduzierter Genauigkeit durch float32 oder gar fixpunkt-Arithmetik besser.