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.

Wie, um überanpassung zu vermeiden, die auf einer einfachen feed-forward-Netzwerk

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

Wie, um überanpassung zu vermeiden, die auf einer einfachen feed-forward-Netzwerk
Wie, um überanpassung zu vermeiden, die auf einer einfachen feed-forward-Netzwerk

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

Schreibe einen Kommentar