Я пытаюсь выполнить локализацию ориентиров на изображениях, используя CNN в Keras.
У меня есть 800 изображений, и я изменяю их размер в 320x240 и нормализую их между 0 и 1. Мои аннотации находятся в XML файл, и я помещаю их в файл CSV, а затем создаю файл .npy для изображений и аннотаций.
Я использую оптимизатор Адама с learning rate = 0.001
. Потеря - custom rmse
, а метрика - mae
.
# RMSE
from keras import backend
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true)))
Я пробовал batch size = 32, 50, 60, 70
. Функция активации relu
, за исключением последнего слоя Dense, за исключением того, что это проблема регрессии.
Это моя архитектура CNN:
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 240, 320, 32) 320
_________________________________________________________________
batch_normalization_1 (Batch (None, 240, 320, 32) 128
_________________________________________________________________
conv2d_2 (Conv2D) (None, 120, 160, 32) 9248
_________________________________________________________________
batch_normalization_2 (Batch (None, 120, 160, 32) 128
_________________________________________________________________
conv2d_3 (Conv2D) (None, 60, 80, 64) 18496
_________________________________________________________________
batch_normalization_3 (Batch (None, 60, 80, 64) 256
_________________________________________________________________
conv2d_4 (Conv2D) (None, 30, 40, 64) 36928
_________________________________________________________________
batch_normalization_4 (Batch (None, 30, 40, 64) 256
_________________________________________________________________
conv2d_5 (Conv2D) (None, 15, 20, 64) 36928
_________________________________________________________________
batch_normalization_5 (Batch (None, 15, 20, 64) 256
_________________________________________________________________
conv2d_6 (Conv2D) (None, 8, 10, 64) 36928
_________________________________________________________________
batch_normalization_6 (Batch (None, 8, 10, 64) 256
_________________________________________________________________
flatten_1 (Flatten) (None, 5120) 0
_________________________________________________________________
dense_1 (Dense) (None, 512) 2621952
_________________________________________________________________
dense_2 (Dense) (None, 256) 131328
_________________________________________________________________
dense_3 (Dense) (None, 136) 34952
Слоя пула нет, потому что изображение размер уменьшен на strides = 2
в слое конв.
136 - мои выходные координаты x, y.
Результат всегда похож на этот, и я прекращаю изучать после 25-30 эпох, потому что val_loss остается стабильным около 44:
Train on 661 samples, validate on 166 samples
Epoch 1/500
- 71s - loss: 139.1782 - mae: 135.1071 - val_loss: 157.1107 - val_mae: 154.2357
Epoch 2/500
- 72s - loss: 52.8662 - mae: 43.3649 - val_loss: 157.6703 - val_mae: 154.7970
Epoch 3/500
- 68s - loss: 31.2599 - mae: 24.8241 - val_loss: 157.5264 - val_mae: 154.6493
Epoch 4/500
- 68s - loss: 26.4959 - mae: 20.9077 - val_loss: 157.2360 - val_mae: 154.3627
Epoch 5/500
- 69s - loss: 23.6135 - mae: 18.6571 - val_loss: 157.1423 - val_mae: 154.2634
Epoch 6/500
- 69s - loss: 22.0984 - mae: 17.4924 - val_loss: 157.0344 - val_mae: 154.1478
Epoch 7/500
- 68s - loss: 20.1804 - mae: 16.0166 - val_loss: 156.7843 - val_mae: 153.9042
Epoch 8/500
Я предполагаю, что модель переоснащается. Я попытался также добавить слой Dropout после первых двух плотных слоев, но результат все тот же.
Как я могу улучшить свою модель?