Mój model uczenia głębokiego nie polega na szkoleniu. Jak mam to zrobić?

Nov 21 2020

Jestem całkiem nowy w Kerasie, przepraszam, jeśli popełniłem podstawowy błąd. Tak więc mój model ma 3 warstwy konwolucyjne (2D) i 4 warstwy gęste, przeplatane warstwami dropout. Próbuję wytrenować model regresji za pomocą obrazów.

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

Kiedy próbuję uruchomić ten model, utrata treningu zmniejsza się zgodnie z oczekiwaniami, utrata walidacji unosi się wokół tego samego regionu, a dokładność walidacji pozostaje dokładnie taka sama. Nie proszę o dane wejściowe, aby ulepszyć mój model (zrobię to samodzielnie), ale potrzebuję pomocy, aby model się odkleił. Chcę zobaczyć, jak zmienia się dokładność walidacji, nawet na trzecim miejscu po przecinku, spadek lub wzrost nie ma znaczenia. Jak mogę odblokować mój model?

Oto obraz tego, co się dzieje, gdy próbuję wytrenować model:

Każde rozwiązanie byłoby bardzo mile widziane.

Odpowiedzi

Srikesh Nov 21 2020 at 16:04

Twój model jest niedopasowany. Jest to spowodowane niewystarczającą gęstością warstw i neuronów. Istnieje wiele sposobów zapobiegania niedopasowaniu, np.

  1. Zwiększenie liczby warstw konwolucyjnych i gęstych.

  2. Zwiększenie liczby neuronów w istniejących warstwach.

  3. Zmniejsz wskaźnik rezygnacji.

  4. Spróbuj zmniejszyć wymiary obrazu wejściowego przed wprowadzeniem danych wejściowych do warstw wejściowych.

SuprateemBanerjee Nov 28 2020 at 02:06

Głównym problemem w tym kodzie była metryka . Dokładność, będąc metryką klasyfikacji, nie działa w modelach regresji. Pomogło również zmniejszenie początkowego wskaźnika uczenia się do 0,0001.

Nieco inna realizacja ma bardziej jednoznacznych odpowiedzi tutaj