conv-autoencoder, что val_loss не уменьшает - PullRequest
1 голос
/ 17 марта 2020

Я строю модель обнаружения аномалий, используя conv-autoencoder на наборе данных UCSD_ped2. Что меня удивляет, так это то, что после очень немногих эпох val_loss не уменьшается. Кажется, что модель не может больше учиться. Я провел некоторое исследование, чтобы улучшить свою модель, но она не улучшается. что я должен сделать, чтобы это исправить? Вот структура моей модели:

x=144;y=224
input_img = Input(shape = (x, y, inChannel))

bn1= BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(input_img)
conv1 = Conv2D(256, (11, 11), strides=(4,4),activation='relu',
               kernel_regularizer=regularizers.l2(0.0005),
               kernel_initializer=initializers.glorot_normal(seed=None),
               padding='same')(bn1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

bn2= BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(pool1)
conv2 = Conv2D(128, (5, 5),activation='relu',
               kernel_regularizer=regularizers.l2(0.0005),
               kernel_initializer=initializers.glorot_normal(seed=None),
               padding='same')(bn2)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

bn3= BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(pool2)
conv3 = Conv2D(64, (3, 3), activation='relu',
               kernel_regularizer=regularizers.l2(0.0005),
               kernel_initializer=initializers.glorot_normal(seed=None),
               padding='same')(bn3)


ubn3=BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(conv3)
uconv3=Conv2DTranspose(128, (3,3),activation='relu',
                      kernel_regularizer=regularizers.l2(0.0005),
                      kernel_initializer=initializers.glorot_normal(seed=None),
                      padding='same')(ubn3)
upool3=UpSampling2D(size=(2, 2))(uconv3)


ubn2=BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(upool3)
uconv2=Conv2DTranspose(256, (3, 3),activation='relu',
                       kernel_regularizer=regularizers.l2(0.0005),
                       kernel_initializer=initializers.glorot_normal(seed=None),
                       padding='same')(ubn2)
upool2=UpSampling2D(size=(2, 2))(uconv2)

ubn1=BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(upool2)
decoded = Conv2DTranspose(1, (11, 11), strides=(4, 4),
                          kernel_regularizer=regularizers.l2(0.0005),
                          kernel_initializer=initializers.glorot_normal(seed=None),
                          activation='sigmoid', padding='same')(ubn1)

autoencoder = Model(input_img, decoded)
autoencoder.compile(loss = 'mean_squared_error', optimizer ='Adadelta',metrics=['accuracy'])
history=autoencoder.fit(X_train, Y_train,validation_split=0.3,
                batch_size = batch_size, epochs = epochs, verbose = 0,
                shuffle=True,
                callbacks=[earlystopping,checkpointer,reduce_lr])
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 144, 224, 1)       0         
_________________________________________________________________
batch_normalization_1 (Batch (None, 144, 224, 1)       4         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 36, 56, 256)       31232     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 18, 28, 256)       0         
_________________________________________________________________
batch_normalization_2 (Batch (None, 18, 28, 256)       1024      
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 18, 28, 128)       819328    
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 9, 14, 128)        0         
_________________________________________________________________
batch_normalization_3 (Batch (None, 9, 14, 128)        512       
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 9, 14, 64)         73792     
_________________________________________________________________
batch_normalization_4 (Batch (None, 9, 14, 64)         256       
_________________________________________________________________
conv2d_transpose_1 (Conv2DTr (None, 9, 14, 128)        73856     
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 18, 28, 128)       0         
_________________________________________________________________
batch_normalization_5 (Batch (None, 18, 28, 128)       512       
_________________________________________________________________
conv2d_transpose_2 (Conv2DTr (None, 18, 28, 256)       295168    
_________________________________________________________________
up_sampling2d_2 (UpSampling2 (None, 36, 56, 256)       0         
_________________________________________________________________
batch_normalization_6 (Batch (None, 36, 56, 256)       1024      
_________________________________________________________________
conv2d_transpose_3 (Conv2DTr (None, 144, 224, 1)       30977     
=================================================================
Total params: 1,327,685
Trainable params: 1,326,019
Non-trainable params: 1,666

размер партии = 30; период обучения = 100 данных имеет 1785 рис .; данные проверки имеют 765 пи c. Я пытался:

  1. удалить kernel_regularizer;
  2. добавить ReduceLROnPlateau.

, но это только немного улучшилось.

Epoch 00043: ReduceLROnPlateau reducing learning rate to 9.99999874573554e-12.

Epoch 00044: val_loss did not improve from 0.00240

Epoch 00045: val_loss did not improve from 0.00240

Когда val_loss получит 0,00240, оно не уменьшится ...

На следующем рисунке были потери с эпохой.

reconstruction result На следующем рисунке показаны результаты реконструкции модели, которые действительно плохие. Как я могу сделать свою модель более работоспособной?

1 Ответ

0 голосов
/ 19 марта 2020

Судя по вашему скриншоту, похоже, что это не проблема переоснащения или недостаточной подгонки.

Насколько я понимаю:

Недостаточная подгонка - ошибка валидации и обучения высокая

Переоснащение - ошибка проверки высокая, ошибка обучения низкая

Хорошая посадка - ошибка проверки низкая, немного выше, чем ошибка обучения

Вообще говоря, набор данных должен быть правильно разделен для обучения и проверки. Обычно обучающий набор должен быть в 4 раза (80/20) номером вашего проверочного набора. Я предлагаю вам попытаться увеличить количество наборов данных, выполнив увеличение данных, и продолжить обучение.

Пожалуйста, обратитесь к документации 1014 * для увеличения данных.

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