Mój model uczenia głębokiego nie polega na szkoleniu. Jak mam to zrobić?
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
Twój model jest niedopasowany. Jest to spowodowane niewystarczającą gęstością warstw i neuronów. Istnieje wiele sposobów zapobiegania niedopasowaniu, np.
Zwiększenie liczby warstw konwolucyjnych i gęstych.
Zwiększenie liczby neuronów w istniejących warstwach.
Zmniejsz wskaźnik rezygnacji.
Spróbuj zmniejszyć wymiary obrazu wejściowego przed wprowadzeniem danych wejściowych do warstw wejściowych.
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