Wie, um überanpassung zu vermeiden, die auf einer einfachen feed-forward-Netzwerk
Mithilfe der pima indians diabetes dataset ich versuche zu bauen, ein genaues Modell mit Keras. Ich habe geschrieben das folgenden code:
# Visualize training history
from keras import callbacks
from keras.layers import Dropout
tb = callbacks.TensorBoard(log_dir='/.logs', histogram_freq=10, batch_size=32,
write_graph=True, write_grads=True, write_images=False,
embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
# Visualize training history
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import numpy
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
# load pima indians dataset
dataset = numpy.loadtxt("pima-indians-diabetes.csv", delimiter=",")
# split into input (X) and output (Y) variables
X = dataset[:, 0:8]
Y = dataset[:, 8]
# create model
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', activation='relu', name='first_input'))
model.add(Dense(500, activation='tanh', name='first_hidden'))
model.add(Dropout(0.5, name='dropout_1'))
model.add(Dense(8, activation='relu', name='second_hidden'))
model.add(Dense(1, activation='sigmoid', name='output_layer'))
# Compile model
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# Fit the model
history = model.fit(X, Y, validation_split=0.33, epochs=1000, batch_size=10, verbose=0, callbacks=[tb])
# list all data in history
print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
Nach einigen versuchen, die ich Hinzugefügt habe, dropout Schichten um, um überanpassung zu vermeiden, aber ohne Glück. Die folgende Grafik zeigt, dass die Validierung von Verlust-und-Verlust-training wird getrennt mit einem Punkt.
Was sonst könnte ich tun, um dies zu optimieren, Netzwerk?
UPDATE:
auf der Grundlage der Kommentare, die ich bekam habe ich optimiert den code so:
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='uniform', kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.01), activation='relu',
name='first_input')) # added regularizers
model.add(Dense(8, activation='relu', name='first_hidden')) # reduced to 8 neurons
model.add(Dropout(0.5, name='dropout_1'))
model.add(Dense(5, activation='relu', name='second_hidden'))
model.add(Dense(1, activation='sigmoid', name='output_layer'))
Hier sind die Graphen für 500 Epochen
- habe meine Lösung funktioniert für Sie? lassen Sie mich wissen, wenn Sie mehr Hilfe brauchen.
- Ich empfehle eine dropout-Ebene nach jeder Dichte-Ebene.
- Ich habe es getan, die Linien gerade abgeflachten mehr ... 🙁
- Das problem scheint gelöst zu sein - du bist nicht wirklich overfitting mehr. Es ist nur so, dass Ihr Modell nicht so viel lernt, wie Sie es gerne hätten. Es gibt ein paar Dinge, die Sie tun können, t-fix, - Abnahme der Legalisierung und dropout ein wenig und finden Sie den sweet spot, oder Sie können versuchen Sie, Ihre Lern-rate I. e. Exponential decay es
- Und das dataset ist ziemlich klein, so dass ich bin mir auch nicht sicher von der Genauigkeit ist es möglich zu bekommen, ohne overfitting
- Die höchste Genauigkeit wird 80.21 nach diesem Papier yildiz.edu.tr/~tulay/Publikationen/Icann-Iconip2003-2.pdf
- Test-Daten besser als Trainingsdaten??? Das klingt wirklich seltsam.
- Es ist offensichtlich, dass etwas falsch ist... Aber ich bin mir nicht sicher, was
- Test besser als training ist absolut üblich bei der Verwendung von dropout.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten Beispiel gab eine Validierung der Genauigkeit > 75% und bei der zweiten gab eine Genauigkeit von < 65% und wenn Sie vergleichen die Verluste für die Epochen unter 100, weniger als < 0,5 für das erste und das zweite war > 0.6. Aber wie ist der zweite Fall besser?.
Das zweite ist für mich ein Fall von
under-fitting
: das Modell der nicht über genug Kapazität, um zu lernen. Während der erste Fall ein problem hat, derover-fitting
denn seine Ausbildung war nicht beendet, wenn overfitting gestartet (early stopping
). Wenn das training beendet wurde, sagen 100 Epoche, es wäre ein viel besseres Modell im Vergleich zwischen den beiden.Sollte das Ziel sein, erhalten kleine vorhersagefehler in ungesehenen Daten und erhöhen Sie die Kapazität des Netzes bis zu einem Punkt außerhalb der überanpassung beginnt zu geschehen.
So, wie Sie zu vermeiden
over-fitting
in diesem speziellen Fall? Verabschiedenearly stopping
.CODE-ÄNDERUNGEN: Zu gehören
early stopping
undinput scaling
.Den
Accuracy
undloss
Graphen:85%
. Und die andere Sache ist die Standard-params inkeras
sind, um dasbest practices
, so es sei denn, Sie haben einen bestimmten Grund, ist es besser, es zu verlassen unverändert.Ersten, versuchen Sie, einige Regularisierung (https://keras.io/regularizers/) wie mit diesem code:
Auch, stellen Sie sicher, verringern Sie Ihre Netzwerk-Größe, d.h. Sie brauchen nicht eine versteckte Schicht von 500 Neuronen - versuchen Sie einfach nur, dass sich zu verringern die Darstellung macht und vielleicht sogar eine weitere Schicht, wenn es noch overfitting. Auch, verwenden Sie nur aufgrund der Kr-Aktivierung. Vielleicht auch versuchen, die Steigerung Ihrer dropout-rate zu so etwas wie 0.75 (obwohl es schon hoch). Sie wahrscheinlich auch nicht brauchen, um ausführen es für so viele Epochen - es wird nur beginnen, um overfit nach lange genug.
Für ein dataset wie der Diabetes eine, die Sie verwenden können, eine viel einfachere Netz. Versuchen Sie, reduzieren Sie die Neuronen in der zweiten Schicht. (Gibt es einen bestimmten Grund warum Ihr gewählt habt, tanh, wie die Aktivierung gibt es?).
Zusätzlich können Sie einfach fügen Sie eine EarlyStopping Rückruf-training: https://keras.io/callbacks/