Модуль Keras CNN перестает улучшать точность примерно через 7 эпох - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть набор данных 12 311, и я использую 80%, 20% разделение для данных проверки. Я применяю 4 разных случайных дополнения, используя пакетный генератор, который отлично работает, как я уже тестировал. Когда я тренирую свой модуль, точность, кажется, перестает улучшаться каждый раз после 7 эпох.

Моя модель:

def nvidiaModel():
        model = Sequential()

        model.add(Conv2D(24, (5, 5), padding="same", subsample=(2, 2), input_shape=(112, 256, 3), activation="elu"))
        model.add(Convolution2D(36, 5, 5, subsample=(2, 2), activation="elu")) # Second CNN
        model.add(Convolution2D(48, 5, 5, subsample=(2, 2), activation="elu")) # Third CNN
        model.add(Convolution2D(64, 3, 3, activation="elu")) # Fourth CNN   # No need for more stride skipping.
        model.add(Convolution2D(64, 3, 3, activation="elu")) # Fifth CNN

        model.add(Flatten())

        model.add(Dense(100, activation="elu"))
        model.add(Dense(50, activation="elu"))
        model.add(Dense(10, activation="elu"))

        model.add(Dense(3, activation="softmax"))   # Which will hold the steering angel.

        optimizer = Adam(lr=1e-5)

        model.compile(loss="mse", optimizer=optimizer, metrics=["accuracy"])

        return model

Описание:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 56, 128, 24)       1824      
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 26, 62, 36)        21636     
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 11, 29, 48)        43248     
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 9, 27, 64)         27712     
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 7, 25, 64)         36928     
_________________________________________________________________
flatten_1 (Flatten)          (None, 11200)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 100)               1120100   
_________________________________________________________________
dense_2 (Dense)              (None, 50)                5050      
_________________________________________________________________
dense_3 (Dense)              (None, 10)                510       
_________________________________________________________________
dense_4 (Dense)              (None, 3)                 33        
=================================================================
Total params: 1,257,041
Trainable params: 1,257,041
Non-trainable params: 0

Обучающие аргументы:

history = model.fit_generator(batchGenerator(X_train, y_train, 1000, 1),
                              steps_per_epoch = 25,
                              epochs = 30,
                              validation_data = batchGenerator(X_valid, y_valid, 300, 0),
                              validation_steps = 20,
                              verbose = 1,
                              shuffle = 1)

Эпоха:

Epoch 1/30
25/25 [==============================] - 52s 2s/step - loss: 0.1709 - acc: 0.6624 - val_loss: 0.1618 - val_acc: 0.6718
Epoch 2/30
25/25 [==============================] - 48s 2s/step - loss: 0.1579 - acc: 0.6764 - val_loss: 0.1524 - val_acc: 0.6767
Epoch 3/30
25/25 [==============================] - 48s 2s/step - loss: 0.1535 - acc: 0.6686 - val_loss: 0.1444 - val_acc: 0.6737
Epoch 4/30
25/25 [==============================] - 48s 2s/step - loss: 0.1460 - acc: 0.6748 - val_loss: 0.1311 - val_acc: 0.7063
Epoch 5/30
25/25 [==============================] - 48s 2s/step - loss: 0.1366 - acc: 0.7076 - val_loss: 0.1262 - val_acc: 0.7370
Epoch 6/30
25/25 [==============================] - 48s 2s/step - loss: 0.1322 - acc: 0.7249 - val_loss: 0.1238 - val_acc: 0.7485
Epoch 7/30
25/25 [==============================] - 48s 2s/step - loss: 0.1313 - acc: 0.7294 - val_loss: 0.1238 - val_acc: 0.7508
Epoch 8/30
25/25 [==============================] - 48s 2s/step - loss: 0.1276 - acc: 0.7370 - val_loss: 0.1173 - val_acc: 0.7538
Epoch 9/30
25/25 [==============================] - 48s 2s/step - loss: 0.1275 - acc: 0.7380 - val_loss: 0.1181 - val_acc: 0.7513
Epoch 10/30
25/25 [==============================] - 50s 2s/step - loss: 0.1260 - acc: 0.7414 - val_loss: 0.1177 - val_acc: 0.7537
Epoch 11/30
25/25 [==============================] - 48s 2s/step - loss: 0.1256 - acc: 0.7430 - val_loss: 0.1159 - val_acc: 0.7553
Epoch 12/30
25/25 [==============================] - 49s 2s/step - loss: 0.1245 - acc: 0.7453 - val_loss: 0.1185 - val_acc: 0.7578
Epoch 13/30
25/25 [==============================] - 49s 2s/step - loss: 0.1232 - acc: 0.7491 - val_loss: 0.1183 - val_acc: 0.7582
Epoch 14/30
25/25 [==============================] - 48s 2s/step - loss: 0.1224 - acc: 0.7501 - val_loss: 0.1219 - val_acc: 0.7423
Epoch 15/30
25/25 [==============================] - 48s 2s/step - loss: 0.1222 - acc: 0.7510 - val_loss: 0.1162 - val_acc: 0.7582
Epoch 16/30
25/25 [==============================] - 49s 2s/step - loss: 0.1218 - acc: 0.7487 - val_loss: 0.1165 - val_acc: 0.7587
Epoch 17/30
25/25 [==============================] - 48s 2s/step - loss: 0.1234 - acc: 0.7454 - val_loss: 0.1185 - val_acc: 0.7442
Epoch 18/30
25/25 [==============================] - 49s 2s/step - loss: 0.1208 - acc: 0.7539 - val_loss: 0.1159 - val_acc: 0.7572
Epoch 19/30
25/25 [==============================] - 49s 2s/step - loss: 0.1215 - acc: 0.7509 - val_loss: 0.1165 - val_acc: 0.7543
Epoch 20/30
25/25 [==============================] - 49s 2s/step - loss: 0.1216 - acc: 0.7507 - val_loss: 0.1171 - val_acc: 0.7590
Epoch 21/30
25/25 [==============================] - 48s 2s/step - loss: 0.1217 - acc: 0.7515 - val_loss: 0.1140 - val_acc: 0.7618
Epoch 22/30
25/25 [==============================] - 49s 2s/step - loss: 0.1208 - acc: 0.7496 - val_loss: 0.1170 - val_acc: 0.7565
Epoch 23/30
25/25 [==============================] - 48s 2s/step - loss: 0.1200 - acc: 0.7526 - val_loss: 0.1169 - val_acc: 0.7575
Epoch 24/30
25/25 [==============================] - 49s 2s/step - loss: 0.1209 - acc: 0.7518 - val_loss: 0.1105 - val_acc: 0.7705
Epoch 25/30
25/25 [==============================] - 48s 2s/step - loss: 0.1198 - acc: 0.7540 - val_loss: 0.1176 - val_acc: 0.7543
Epoch 26/30
25/25 [==============================] - 48s 2s/step - loss: 0.1206 - acc: 0.7528 - val_loss: 0.1127 - val_acc: 0.7608
Epoch 27/30
25/25 [==============================] - 48s 2s/step - loss: 0.1204 - acc: 0.7526 - val_loss: 0.1185 - val_acc: 0.7532

Я попытался увеличить размер пакета, но результат тот же, он перестанет улучшаться после определенного количества эпох. Я попытался добавить выпадающие слои, тот же результат.

У кого-нибудь есть предложение о том, что здесь может пойти не так?

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Не зная больше о типе проблемы, которую вы решаете, и соответствующем наборе данных, невозможно сказать наверняка.Например, у вас может быть грязный набор данных или серьезная проблема, для которой 75% настолько хороши, насколько вы можете получить (хотя я бы сказал, что это маловероятно).Другая возможность - 75% ваших примеров взяты из одного класса, а ваша модель просто изучает режим (то есть всегда угадывает этот класс).

На первый взгляд, я бы попробовал другую потерю - mseна выходе softmax скорее всего приведет к исчезающему градиенту.Если вы делаете классификацию, я бы начал с (sparse_categorical_)crossentropy.

0 голосов
/ 28 апреля 2019

Я согласен с @DomJack, не зная больше о входных данных, сложно дать правильные указания.Тем не менее, вы можете попробовать добавить выпадающий слой и слой maxpool после первого, второго и третьего слоев конвоя.Вы можете проверить пару показателей обучения и пару других оптимизаторов, таких как адаград, оптимизаторы импульса.Вы также можете увеличить количество фильтров 16,32, 64,128 и 256.

Было бы полезно, если бы вы могли создавать и распространять суть Google colab или любым другим способом воспроизвести проблему.Если ваши данные являются конфиденциальными, вы можете использовать общедоступные наборы данных и продемонстрировать проблему.Проверьте пару оптимизаторов здесь и здесь .Надеюсь, это поможет вам.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...