Mon modèle d'apprentissage en profondeur n'est pas la formation. Comment le faire s'entraîner?

Nov 21 2020

Je suis assez nouveau à Keras, veuillez m'excuser si j'ai fait une erreur fondamentale. Donc, mon modèle a 3 couches convolutionnelles (2D) et 4 couches denses, entrecoupées de couches Dropout. J'essaie de former un modèle de régression à l' aide d'images.

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')

Lorsque j'essaie d'exécuter ce modèle, la perte d'entraînement diminue comme prévu, la perte de validation plane autour de la même région et la précision de la validation reste exactement la même. Je ne demande pas d'entrées pour améliorer mon modèle (je le ferai moi-même), mais j'ai besoin d'aide pour décoller le modèle. Je veux voir la précision de la validation changer, même à la troisième décimale, diminuer ou augmenter n'a pas d'importance. Comment décoller mon modèle?

Voici une image de ce qui se passe lorsque j'essaie d'entraîner le modèle:

Toute solution serait très appréciée.

Réponses

Srikesh Nov 21 2020 at 16:04

Votre modèle est sous-ajusté. Elle est due à une insuffisance de couches denses et de neurones. Il existe de nombreuses façons d'éviter le sous-ajustement tel que,

  1. Augmentation du nombre de couches convolutives et denses.

  2. Augmenter le nombre de neurones dans les couches existantes.

  3. Réduisez le taux d'abandon.

  4. Essayez de réduire les dimensions de l'image d'entrée avant de donner une entrée aux calques d'entrée.

SuprateemBanerjee Nov 28 2020 at 02:06

Le principal problème dans ce code était la métrique . La précision, étant une métrique de classification ne fonctionne pas sur les modèles de régression. La diminution du taux d'apprentissage initial à 0,0001 a également aidé.

Une implémentation légèrement différente a obtenu une réponse plus concluante ici