Mein Deep-Learning-Modell ist kein Training. Wie mache ich es trainieren?

Nov 21 2020

Ich bin ziemlich neu bei Keras. Bitte entschuldigen Sie, wenn ich einen grundlegenden Fehler gemacht habe. Mein Modell hat also 3 Faltungsebenen (2D) und 4 dichte Ebenen, die mit Dropout-Ebenen durchsetzt sind. Ich versuche, ein Regressionsmodell mit Bildern zu trainieren .

X_train.shape = (5164, 160, 320, 3)

y_train.shape = (5164)

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, Activation, MaxPooling2D, Dropout
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import Huber
from tensorflow.keras.optimizers.schedules import ExponentialDecay

model = Sequential()
model.add(Conv2D(input_shape=(160, 320, 3), filters=32, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))

model.add(Conv2D(filters=256, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))

model.add(Conv2D(filters=512, kernel_size=3, padding="valid"))
model.add(MaxPooling2D(pool_size=(3,3)))
model.add(Activation('relu'))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(1))

checkpoint = ModelCheckpoint(filepath="./ckpts/model.ckpt", monitor='val_loss', save_best_only=True)
stopper = EarlyStopping(monitor='val_acc', min_delta=0.0003, patience = 10)

lr_schedule = ExponentialDecay(initial_learning_rate=0.1, decay_steps=10000, decay_rate=0.9)
optimizer = Adam(learning_rate=lr_schedule)
loss = Huber(delta=0.5, reduction="auto", name="huber_loss")

model.compile(loss = loss, optimizer = optimizer, metrics=['accuracy'])
model.fit(X_train, y_train, validation_split = 0.2, shuffle = True, epochs = 100, 
          callbacks=[checkpoint, stopper])

model.save('model.h5')

Wenn ich versuche, dieses Modell auszuführen, verringert sich der Trainingsverlust wie erwartet, der Validierungsverlust bewegt sich in derselben Region und die Validierungsgenauigkeit bleibt genau gleich. Ich bitte nicht um Eingaben, um mein Modell zu verbessern (das mache ich selbst), aber ich brauche Hilfe, um das Modell zu lösen. Ich möchte, dass sich die Validierungsgenauigkeit auch bei der dritten Dezimalstelle ändert. Eine Verringerung oder Erhöhung spielt keine Rolle. Wie kann ich mein Modell lösen?

Hier ist ein Bild davon, was passiert, wenn ich versuche, das Modell zu trainieren:

Jede Lösung wäre sehr dankbar.

Antworten

Srikesh Nov 21 2020 at 16:04

Ihr Modell ist unterpassend. Es wird durch unzureichende dichte Schichten und Neuronen verursacht. Es gibt viele Möglichkeiten, um die Unteranpassung zu verhindern, wie z.

  1. Erhöhen der Anzahl der Faltungs- und Dichteschichten.

  2. Erhöhen der Anzahl von Neuronen in den vorhandenen Schichten.

  3. Reduzieren Sie die Abbrecherquote.

  4. Versuchen Sie, die Abmessungen des Eingabebilds zu verringern, bevor Sie die Eingabeebenen eingeben.

SuprateemBanerjee Nov 28 2020 at 02:06

Das Hauptproblem in diesem Code war die Metrik . Genauigkeit als Klassifizierungsmetrik funktioniert bei Regressionsmodellen nicht. Die Senkung der anfänglichen Lernrate auf 0,0001 half ebenfalls.

Eine etwas andere Implementierung bekam eine schlüssige Antwort hier