Проблема с перенастройкой моих данных проверки - PullRequest
2 голосов
/ 04 апреля 2020

Я применяю модель CNN, используя керасы. Я подал детальные коэффициенты уровня дискретного вейвлет-преобразования 5 в виде двумерного массива (5,3840) в CNN. Я хотел бы использовать CNN для прогнозирования захвата. Проблема в том, что моя сеть перегружена. Любое предложение о том, как решить проблему переоснащения.

    input_shape=(1, 22, 5, 3844)
    model = Sequential()
    #C1
    model.add(Conv3D(16, (22, 5, 5), strides=(1, 2, 2), padding='same',activation='relu',data_format= "channels_first", input_shape=input_shape))
    model.add(keras.layers.MaxPooling3D(pool_size=(1, 2, 2),data_format= "channels_first",  padding='same'))
    model.add(BatchNormalization())
    #C2
    model.add(Conv3D(32, (1, 3, 3), strides=(1, 1,1), padding='same',data_format= "channels_first",  activation='relu'))#incertezza se togliere padding
    model.add(keras.layers.MaxPooling3D(pool_size=(1,2, 2),data_format= "channels_first", ))
    model.add(BatchNormalization())

     #C3
    model.add(Conv3D(64, (1,3, 3), strides=(1, 1,1), padding='same',data_format= "channels_first",  activation='relu'))#incertezza se togliere padding
    model.add(keras.layers.MaxPooling3D(pool_size=(1,2, 2),data_format= "channels_first",padding='same' ))
    model.add(BatchNormalization())

    model.add(Flatten())
    model.add(Dropout(0.5))
    model.add(Dense(256, activation='sigmoid'))
    model.add(Dropout(0.5))
    model.add(Dense(2, activation='softmax'))

    opt_adam = keras.optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
    model.compile(loss='categorical_crossentropy', optimizer=opt_adam, metrics=['accuracy'])

    return model

Ответы [ 2 ]

4 голосов
/ 04 апреля 2020

Существует 2 часто используемых регуляризации техники, позволяющие избежать переточки:

  1. Регуляризация L1 и L2 : Регуляризаторы позволяют применять штрафы на параметры слоя или активность слоя во время оптимизации. Эти штрафы включены в функцию потерь, которую оптимизирует сеть.

    from keras import regularizers
    model.add(Dense(64, input_dim=64,
              kernel_regularizer=regularizers.l2(0.01),
              activity_regularizer=regularizers.l1(0.01)))
    
  2. Выпадение : Выпадение состоит в том, что случайная установка доли дроби входных единиц на 0 при каждое обновление во время обучения, которое помогает предотвратить переоснащение.

    from keras.layers import Dropout
    model.add(Dense(60, input_dim=60, activation='relu'))
    model.add(Dropout(rate=0.2))
    model.add(Dense(30, activation='relu'))
    model.add(Dropout(rate=0.2))
    model.add(Dense(1, activation='sigmoid'))
    

Также вы можете использовать Early-Stopping , чтобы прервать обучение, когда потеря проверки не будет ' t больше не уменьшается

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=2)
model.fit(x, y, validation_split=0.2, callbacks=[early_stopping])

Кроме того, вы можете рассмотреть Data-Augmentation методы, такие как обрезка, заполнение и горизонтальное переворачивание. С помощью этих методов вы можете увеличить разнообразие данных, доступных для вашей модели обучения, без фактического сбора новых данных. Таким образом, вы можете зафиксировать инвариантность данных и уменьшить чрезмерную подгонку

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                    steps_per_epoch=len(x_train) / 32, epochs=epochs)
1 голос
/ 04 апреля 2020

Шаги по устранению наложения:

  • Уменьшите количество нейронных единиц в ваших скрытых слоях

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

Попробуйте заменить сигмовидный слой плотным слоем с активацией и выходом relu (n, 2), за которым следует слой softmax.

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

...