2017-02-23 3 views
1

Ich brauche Hilfe bei der Genauigkeit für das Training des Modells für maschinelles Lernen.Machine Learning Genauigkeit zeigt 0

Meine Eingabe für das Training sind mehrere Array mit 500 Integer/Daten, die ich es in der Datei hdf5 unter Dataset namens "the_data" gespeichert. In diesem Beispiel habe ich 100 Arrays.

[[1,2,3,...500], 
[501,502,...1000], 
[1001,...  ], 
.... 
......   ]] 

Die Ausgabe ist eine Zufallszahl, die ich vor der Hand erzeugen und es als ‚output.txt‘ speichern. Es hat 100 Zufallszahlen.

194521, 307329, 182440, 180444, 275690,...,350879 

unter meinem modifizierten Skript basiert auf http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/

import h5py 
from keras.models import Sequential 
from keras.layers import Dense 

seed = 7 
np.random.seed(seed) 

input_data = h5py.File('test.h5', 'r') 
output_data = open("output.txt", "r") 

X = input_data['the_data'][:] 
Y = output_data.read().split(',') 

model = Sequential() 
model.add(Dense(500, input_dim=500, init='normal', activation='relu')) 
model.add(Dense(100, init='normal', activation='relu')) 
model.add(Dense(60, init='normal', activation='relu')) 
model.add(Dense(1, init='normal', activation='sigmoid')) 

model.compile(loss='binary_crossentropy', optimizer='adamax', metrics=['accuracy']) 
model.fit(X, Y, nb_epoch=500, batch_size=10) 
scores = model.evaluate(X, Y) 

print("%s: %.2f%% , %s: %.2f%%" % (model.metrics_names[0], scores[0]*100, model.metrics_names[1], scores[1]*100)) 

Was ich bekommen habe, wie das Ergebnis so einen Gedanken über jemand

Epoch 500/500 
100/100 [==============================] - 0s - loss: -4851446.0896 - acc: 0.0000e+00 
100/100 [==============================] - 0s 
loss: -485144614.93% , acc: 0.00% 

ist

Hat warum passiert ist das?

Vielen Dank für Ihre Hilfe.

Antwort

3

Wissen Sie, was die binäre Crossentropie ist?

Es ist eine Verlustfunktion für Ziele, die binär (0 oder 1) sind. Der Verlust ist dann ein Logarithmus des output oder output - 1 abhängig vom Zielwert. Sie können es also nicht in Ihrem Fall anwenden.

Sie wollen numerische Werte vorhersagen, also sollten Sie so etwas wie root mean squarre errors verwenden.

Die Genauigkeit macht auch nicht Sinn, da Sie nicht versuchen, eine Klasse vorherzusagen, sondern einen reellen Zahlenwert. Es wird selten genau das Gute vorhersagen. Genauigkeit wird zum Beispiel mit binärer Crossentropie verwendet, dann können wir einen Ausgang klassifizieren, der 0,7 in Klasse 1 ist. Oder 0,2 in Klasse 0.

Noch ein Kommentar: Warum sollten Sie zufällige Werte vorhersagen? Es kann nicht funktionieren ... das Netzwerk muss Muster erkennen und es gibt keine Muster in zufälligen Zielen.

Ich hoffe, das hilft Ihnen ein bisschen.

+0

Ja, danke, dass du binäre Crossentropie auf mich gerichtet hast. Ich dachte nicht viel darüber nach, weil ich mich zu sehr auf den Output konzentrierte. Ich werde mehr auf das, was Sie vorgeschlagen haben, schauen. Ich wollte auch nur versuchen, ob das Netzwerk auch numerische Werte als Ausgabe erkennen kann. Keine anderen Gründe. Vielen Dank für Ihre Antwort. – Fang

1

Ich stimme Nassim Ben. Versuchen Sie, diese

model.compile(loss='mean_square', optimizer='sgd') 

Dann verwenden, um die Genauigkeit Sie eine andere Art und Weise müssen zu berechnen:

from sklearn.metrics import mean_squared_error 

mse = mean_squared_error(Y,Y_predicted) 

print('MSE : %.3f' % mse) 
print("Acc = ", 1-numpy.sqrt(mse)) 

Das ist für mich gearbeitet. Aber ehrlich gesagt, ich fühle mich wie Keras funktioniert nicht gut mit der Vorhersage hoher Zahlen (andere dann zwischen 0 und 1) Ich würde mich freuen, wenn ich mich geirrt hätte.

+0

Vielen Dank für Ihre Antwort. Ich habe nach 'mean_square' gesucht, aber nicht wirklich verstanden, wie man es benutzt. Ich werde versuchen, wie Sie vorgeschlagen haben und werde es auf meine Frage aktualisieren. – Fang

+0

Deshalb wird empfohlen, Ihre Eingaben und Ziele zu normalisieren. Es wird auch nicht gut funktionieren, wenn Sie Aktivierungen wie Sigmoid oder Tanh verwenden, da sie die Ausgabe begrenzen. –