2016-11-26 3 views
0

Ich trainiere derzeit meine Regression Netzwerk mit Crossvalidierung, ich habe keine Etiketten, aber spezifische Eingabe, die auf einen bestimmten Ausgang zugeordnet werden sollte, sollte das Netzwerk dann die Zuordnung generieren.Ich habe ein paar Probleme mit, wie die Falten werden definiert.Wie ist die Größe jedes k Falten definiert?

die Art, wie ich tun Kreuzvalidierung ist wie folgt:

############################### Training setup ################################## 

#Define 10 folds: 
seed = 7 
np.random.seed(seed) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed) 
print "Splits" 
cvscores_loss = [] 

for train, test in kfold.split(train_set_data_vstacked_normalized,train_set_output_vstacked): 

    print "Model definition!" 
    model = Sequential() 

    #act = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh)) 

    #act1 = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400,input_dim=400, init="normal",activation=K.tanh)) 

    #act2 = PReLU(init='normal', weights=None) 
    model.add(Dense(output_dim=400, input_dim=400, init="normal",activation=K.tanh)) 

    act4=ELU(10000) 
    model.add(Dense(output_dim=13, input_dim=300, init="normal",activation=act4)) 

    print "Compiling" 
    model.compile(loss='mean_squared_error', optimizer='RMSprop', metrics=["accuracy"]) 
    print "Compile done! " 

    print '\n' 

    print "Train start" 
    model.fit(train_set_data_vstacked_normalized[train],train_set_output_vstacked[train], nb_epoch=10, verbose=1) 

    loss, accuracy = model.evaluate(x=train_set_data_vstacked_normalized[test],y=train_set_output_vstacked[test],verbose=1) 
    print 
    print('loss: ', loss) 
    print('accuracy: ', accuracy) 
    print() 
    print model.summary() 
    print "New Model:" 
    cvscores_loss.append(loss) 


print("%.2f%% (+/- %.2f%%)" % (numpy.mean(cvscores_loss), numpy.std(cvscores_loss))) 

Problem mit diesem Code ist, dass ich nie die for-Schleife eingeben .. eine Warnmeldung nach „Splits“ erhalten gedruckt wird ... Es ist.

Splits 
/home/k/.local/lib/python2.7/site-packages/sklearn/model_selection/_split.py:579: Warning: The least populated class in y has only 1 members, which is too few. The minimum number of groups for any class cannot be less than n_splits=10. 

Welche es in Frage stellen, wie kfold, weiß, was die Ein- und Ausgang Dimensionen meines neuronalen Netzes ist? ...

Soll ich es irgendwo definieren? oder wie? ..

Antwort

1

Die Nachricht sagt Ihnen das Problem. Eine deiner Zielklassen hat nur 1 Mitglied. Wenn es in 10 Falten geschichtet wird, benötigt es mindestens 10 Mitglieder jeder Klasse, so dass es 1 in jede Falte setzen kann.

Sie müssen die Anzahl der Zielklassen überprüfen, um die betreffende Klasse zu finden und sie zu entfernen.

+0

Its a Regressionsproblem .. Also habe ich keine Klassen als solche .. Ich trainiere mein Netzwerk, um eine bestimmte Eingabe einer bestimmten Ausgabe zuzuweisen. Eine bestimmte Ausgabe ist keine Beschriftung, sondern ein Rohmerkmal mit der Länge 13. Welcher "train_set_output_vstacked [0]" auch ausgegeben wird. –

+1

StratifiedKFold erfordert Klassen. Verwenden Sie KFold für die Regression. Oder wenn Sie cross_val_score verwenden, dann wählt es basierend auf der Regression oder Klassifizierung, welche verwendet werden soll. – simon

0

Ich denke, dass Sie das komplizierter macht. Wenn Sie eine Kreuzvalidierung für das Keras-Modell durchführen müssen, können Sie keras scikit-learn API verwenden. Dazu müssen Sie:

einige Sachen Import:

from keras.wrappers.scikit_learn import KerasClassifier 
from sklearn.model_selection import StratifiedKFold 
from sklearn.model_selection import cross_val_score 

eine Funktion erstellen, die Ihr Modell definiert:

def model_creation(): 
    model = Sequential() 
    model.add(...) 
    ... 
    model.compile(...) 
    return model 

und verwenden den Wrapper:

model = KerasClassifier(build_fn=model_creation, nb_epoch=100, batch_size=100, verbose=0) 
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) 
results = cross_val_score(model, X, y, cv=kfold) 
Verwandte Themen