2016-06-03 9 views
1

Versucht, ein sehr einfaches CNN mit Keras/Theano auf einem binären Klassifikationsproblem zu trainieren. Die Verlustfunktion konvergiert immer zu 8.0151 oder so. Parameter-/Architekturänderungen haben nicht geholfen. Also habe ich ein sehr einfaches Beispiel gemacht: neue Eingabe-Arrays, eins ist alles Einsen, das andere alles Nullen. Kein Würfel, gleiches Verhalten. Ich habe alle 1s und alle -1's gleich ausprobiert. Dann alle 0's und zufällig. Gleich. Reduzierte Abmessungen und Tiefe, entfernt Dropout, monkeyed mit Parametern, gleich. Hilfe! Was ist los?Sehr einfaches Keras CNN mit 2 Klassen, die unerklärliche Antworten geben

import numpy 

A = [] 
B = [] 

for j in range(100): 
    npa = numpy.array([[1 for j in range(100)] for i in range(100)]) 
    A.append(npa.reshape(1,npa.shape[0],npa.shape[1])) 

for j in range(100): 
    npa = numpy.array([[0 for j in range(100)] for i in range(100)]) 
    B.append(npa.reshape(1,npa.shape[0],npa.shape[1])) 

trainXA = [] 
trainXB = [] 
testXA = [] 
testXB = [] 

for j in range(len(A)): 
    if ((j+2) % 7) != 0: 
     trainXA.append(A[j]) 
     trainXB.append(B[j]) 
    else: 
     testXA.append(A[j]) 
     testXB.append(B[j]) 

X_train = numpy.array(trainXA + trainXB) 
X_test = numpy.array(testXA + testXB) 

Y_train = numpy.array([[1,0] for i in range(len(X_train)/2)] + [[0,1] for i in range(len(X_train)/2)]) 

import random 

def jumblelists(C,D): 
    outC = [] 
    outD = [] 
    for j in range(len(C)): 
     newpos = int(random.random()*(len(outC)+1)) 
     outC = outC[:newpos]+[C[j]]+outC[newpos:] 
     outD = outD[:newpos]+[D[j]]+outD[newpos:] 
    return numpy.array(outC),numpy.array(outD) 

X_train,Y_train = jumblelists(X_train,Y_train) 

from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation, Flatten 
from keras.layers import Convolution2D, MaxPooling2D 
from keras.optimizers import SGD 

model = Sequential() 
model.add(Convolution2D(32, 3, 3, border_mode='valid', input_shape=(1,100,100))) 
model.add(Activation('relu')) 
model.add(Convolution2D(32, 3, 3)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(128)) 
model.add(Activation('relu')) 

model.add(Dense(2)) 
model.add(Activation('softmax')) 

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='binary_crossentropy', optimizer=sgd) 

model.fit(X_train, Y_train, batch_size=32, nb_epoch=10) 

Antwort

2

Ihre Lernrate ist einfach viel zu hoch eingestellt, was wahrscheinlich zu einer Explosion in Gewichten und Gradienten führt. Ändern Sie einfach

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True) 

zu

sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True) 

Sie könnten auch einen anderen Optimierer versuchen. Adam mit Standardeinstellungen ist oft eine gute Wahl.

+0

Ja, das schien viel zu helfen (Senkung der Lernrate). Die oben genannten Spielzeugbeispiele wurden sofort richtig trainiert. Jetzt echte Probleme ausprobieren. Seltsam, dass die Keras Hauptdokumentation "VGG-like convnet" Beispiel eine Lernrate von 0,1 ... –

+0

@anonymous_coward hat. Unterschiedliche Netzwerke erfordern unterschiedliche Lernraten, am besten ist eine adaptive Lernrate zu verwenden (wie beim ADAM-Optimierer). –

+0

@anonymous_coward Wenn dieser Beitrag auf Ihre Frage geantwortet hat, markieren Sie diese Antwort als akzeptiert (klicken Sie auf das Häkchen unterhalb der Schaltflächen "hoch/runter"). Vielen Dank! – nemo

Verwandte Themen