Memory Error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, es kommt ja auch irgendwann drauf an, wieviel GB für den einzelnen Prozess möglich sind...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@carrot: Quellcode?
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

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.
"""
Zuletzt geändert von Anonymous am Donnerstag 22. September 2011, 17:29, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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?
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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. :wink:


Edit: deets war schneller.
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

Hast du 64-Bit Python, oder noch 32Bit?
32-Bit :( Python 2.6
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

Hmm ich denke, dann werde ich mal meinen Datensatz komprimieren.
Ich danke euch soweit!
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.
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

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?!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

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.
deets

Wie schon erwaehnt - mit 32 Bit Python ist das eh egal. Dann gehen nicht mehr als 3 oder so GB an Speicher.
carrot
User
Beiträge: 19
Registriert: Montag 5. September 2011, 15:13

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Macht es möglicherweise Sinn, die Arbeit auf 2 Python-Prozesse aufzuteilen, die sich über eine Pipe informieren?
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.
Antworten