Почему точность обучения модели увеличивается очень медленно (почти остается стабильной) в течение некоторого количества эпох?

#keras #deep-learning #conv-neural-network

#keras #глубокое обучение #conv-neural-network

Вопрос:

Я работаю над набором данных CIFAR-10 и пытаюсь получить контрольный показатель или, по крайней мере, точность 90%. Я перепробовал все перечисленные ниже способы, но большинство из них приводят к одному и тому же результату, и это …. точность обучения не улучшается после некоторых эпох и остается стабильной, а также точность проверки немного колеблется.

Каталог dataset имеет вид :

 cifar

   train(total 40,000 images. 4000 images per class. Total 10 classes)   
      airplane
      automobile......(similar structure for test and validation as well)

   test.(total 10,000 images. 1000 images per class)

   validation.(total 10,000 images. 1000 images per class)

code.py
  

Я попытался использовать следующие параметры :

  1. Оптимизаторы: adam, nadam, adadelta и SGD.
  2. Размеры пакета: 16,32.
  3. Изначально начиналось с двух слоев свертки. Сначала я тренировался с 64 фильтрами в обоих, а затем в обоих слоях свертки с 128 фильтрами. Теперь я добавил третий уровень свертки.

Вот код :

 import keras

from keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout, 
Activation, BatchNormalization, GlobalAveragePooling2D

from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers, regularizers


classifier = Sequential()

classifier.add(Conv2D(filters=64, kernel_size=(3,3), input_shape= (32,32,3), use_bias=False))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))
classifier.add(MaxPool2D(pool_size=(2,2)))
classifier.add(Conv2D(filters=64, kernel_size=(3,3), use_bias=False))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))
classifier.add(MaxPool2D(pool_size=(2,2)))
classifier.add(Conv2D(filters=64, kernel_size=(3,3), use_bias=False))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))
classifier.add(MaxPool2D(pool_size=(2,2)))
classifier.add(GlobalAveragePooling2D())
classifier.add(Dense(units=10,activation='softmax'))

'''
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
'''

classifier.compile(optimizer='nadam', loss='categorical_crossentropy', metrics=['accuracy'])

train_datagen=ImageDataGenerator(rescale=1./255, 
   featurewise_center=True,featurewise_std_normalization=True, 
   shear_range=0.2,rotation_range=20, width_shift_range=0.2, 
   height_shift_range=0.2,horizontal_flip=True)

test_datagen=ImageDataGenerator(rescale=1./255, 
   featurewise_center=True,featurewise_std_normalization=True)

train_dataset=train_datagen.flow_from_directory(
   directory='cifar/train', target_size=(32,32), 
   batch_size=16, class_mode='categorical')

test_dataset=test_datagen.flow_from_directory(
   directory='cifar/validation', target_size=(32,32), 
   batch_size=16, class_mode='categorical')

classifier.fit_generator(train_dataset, 
   steps_per_epoch=2500, epochs=50, 
   validation_data=test_dataset, validation_steps=625)
  

И вот наблюдения за эпохами :

 Epoch 17/50 
2500/2500 [==============================] - 259s 103ms/step - loss: 
0.9305 - acc: 0.6840 - val_loss: 0.8195 - val_acc: 0.7111

Epoch 18/50
2500/2500 [==============================] - 257s 103ms/step - loss: 
0.9280 - acc: 0.6817 - val_loss: 0.9981 - val_acc: 0.6816

Epoch 19/50
2500/2500 [==============================] - 260s 104ms/step - loss: 
0.9112 - acc: 0.6896 - val_loss: 0.9393 - val_acc: 0.6786

Epoch 20/50
2500/2500 [==============================] - 257s 103ms/step - loss: 
0.9053 - acc: 0.6881 - val_loss: 0.8509 - val_acc: 0.7172

Epoch 21/50
2500/2500 [==============================] - 259s 104ms/step - loss: 
0.9110 - acc: 0.6874 - val_loss: 0.8427 - val_acc: 0.7211

Epoch 22/50
2500/2500 [==============================] - 257s 103ms/step - loss: 
0.8967 - acc: 0.6944 - val_loss: 0.7139 - val_acc: 0.7592

Epoch 23/50
2500/2500 [==============================] - 257s 103ms/step - loss: 
0.8825 - acc: 0.6967 - val_loss: 0.8611 - val_acc: 0.7066

Epoch 24/50
2500/2500 [==============================] - 260s 104ms/step - loss: 
0.8819 - acc: 0.6967 - val_loss: 0.7436 - val_acc: 0.7447

Epoch 25/50
2500/2500 [==============================] - 270s 108ms/step - loss: 
0.8780 - acc: 0.6995 - val_loss: 0.8129 - val_acc: 0.7310

Epoch 26/50
2500/2500 [==============================] - 279s 112ms/step - loss: 
0.8756 - acc: 0.7010 - val_loss: 0.7890 - val_acc: 0.7276

Epoch 27/50
2500/2500 [==============================] - 283s 113ms/step - loss: 
0.8680 - acc: 0.7027 - val_loss: 0.8185 - val_acc: 0.7307

Epoch 28/50
2500/2500 [==============================] - 287s 115ms/step - loss: 
0.8651 - acc: 0.7043 - val_loss: 0.7457 - val_acc: 0.7460

Epoch 29/50
2500/2500 [==============================] - 286s 114ms/step - loss: 
0.8531 - acc: 0.7065 - val_loss: 1.1669 - val_acc: 0.6483

Epoch 30/50
2500/2500 [==============================] - 290s 116ms/step - loss: 
0.8521 - acc: 0.7085 - val_loss: 0.7221 - val_acc: 0.7565

Epoch 31/50
2500/2500 [==============================] - 289s 116ms/step - loss: 
0.8518 - acc: 0.7072 - val_loss: 0.7308 - val_acc: 0.7549

Epoch 32/50
2500/2500 [==============================] - 291s 116ms/step - loss: 
0.8465 - acc: 0.7119 - val_loss: 0.8550 - val_acc: 0.7182

Epoch 33/50
2500/2500 [==============================] - 302s 121ms/step - loss: 
0.8406 - acc: 0.7121 - val_loss: 1.0259 - val_acc: 0.6770

Epoch 34/50
2500/2500 [==============================] - 286s 115ms/step - loss: 
0.8424 - acc: 0.7120 - val_loss: 0.6924 - val_acc: 0.7646

Epoch 35/50
2500/2500 [==============================] - 273s 109ms/step - loss: 
0.8337 - acc: 0.7143 - val_loss: 0.8744 - val_acc: 0.7220

Epoch 36/50
2500/2500 [==============================] - 285s 114ms/step - loss: 
0.8332 - acc: 0.7144 - val_loss: 1.0132 - val_acc: 0.6753

Epoch 37/50
2500/2500 [==============================] - 275s 110ms/step - loss: 
0.8382 - acc: 0.7122 - val_loss: 0.7873 - val_acc: 0.7366
  

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

Комментарии:

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

2. Возможно, будет лучше изменить количество фильтров в слоях свертки. Начните с одного слоя из 64 фильтров, а два других — со 128 фильтров. Вы можете прочитать похожую проблему , это может быть полезно

3. @Eric спасибо за предложение. Я попробую это. Кроме того, будет ли порядок слоев свертки, т.Е. (фильтры) — (128,128,64) или (128,64,128) или (64,128,128), существенно влиять на результаты?

4. Я так думаю, потому что каждый слой изучает определенное свойство (контуры, области …). Но я только что сказал это, потому что обычная конфигурация (64,128, 128), лучший способ узнать это — сравнить результаты между этими тремя коинфигурациями.

5. Хорошо, спасибо. Я тоже попробую это @Eric.

Ответ №1:

Уменьшите скорость обучения. Это слишком высоко