Точность обучения и тестирования не увеличивается для CNN, за которым следует RNN для проверки подписи - PullRequest
2 голосов
/ 21 сентября 2019

В настоящее время я работаю над проверкой подписи в Интернете.Набор данных имеет переменную форму (x, 7), где x - это количество точек, которые человек использовал для подписи своей подписи.У меня есть следующая модель:

    model = Sequential()
    #CNN
    model.add(Conv1D(filters=64, kernel_size=3, activation='sigmoid', input_shape=(None, 7)))
    model.add(MaxPooling1D(pool_size=3))
    model.add(Conv1D(filters=64, kernel_size=2, activation='sigmoid'))

    #RNN
    model.add(Masking(mask_value=0.0))
    model.add(LSTM(8))
    model.add(Dense(2, activation='softmax'))

    opt = Adam(lr=0.0001)
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    model.summary()

    print(model.fit(x_train, y_train, epochs=100, verbose=2, batch_size=50))

    score, accuracy = model.evaluate(x_test,y_test, verbose=2)
    print(score, accuracy)

Я знаю, что это может быть не самая лучшая модель, но я впервые строю нейронную сеть.Я должен использовать CNN и RNN, как это требуется для моего проекта с отличием.На данный момент я достигаю 0,5142 как наивысшей точности обучения и 0,54 точности тестирования.Я попытался увеличить количество эпох, изменить функцию активации, добавить больше слоев, переместить слои вокруг, изменить скорость обучения и оптимизатор.

Пожалуйста, поделитесь некоторыми советами по изменению моей модели или набора данных.Буду признателен за любую оказанную помощь.

1 Ответ

1 голос
/ 22 сентября 2019

Для CNN-RNN, некоторые многообещающие вещи, которые нужно попробовать:

  • слои Conv1D : activation='relu', kernel_initializer='he_normal'
  • слой LSTM: activation='tanh' и recurrent_dropout=.1, .2, .3
  • Оптимизатор : Nadam, lr=2e-4 (Nadam может значительно превзойти все остальные оптимизаторы для RNN)
  • batch_size : опустить его.Если у вас не более 200 партий, установите batch_size=32;меньший размер партии лучше использует механизм стохастика оптимизатора и может улучшить обобщение
  • Выпадение : сразу после второй Conv1D, со скоростью .1, .2 - или после первой Conv1Dсо скоростью .25, .3, но только , если вы используете SqueezeExcite (см. ниже), иначе MaxPooling также не будет работать
  • SqueezeExcite : показаноповысить производительность всей CNN в широком спектре задач;Реализацию Keras вы можете использовать ниже
  • BatchNormalization : хотя ваша модель невелика, она все еще глубока и может извлечь выгоду из одного слоя BN сразу после второго Conv1D
  • снижение веса L2 : на сначала Conv1D, чтобы предотвратить его запоминание ввода;попробуйте 1e-5, 1e-4, например, kernel_regularizer=l2(1e-4) # from keras.regularizers import l2
  • Предварительная обработка : убедитесь, что все данные нормализованы (или стандартизированы, если временной ряд), и партии перетасовываются каждую эпоху
def SqueezeExcite(_input):
    filters = _input._keras_shape[-1]

    se = GlobalAveragePooling1D()(_input)
    se = Reshape((1, filters))(se)
    se = Dense(filters//16,activation='relu',   
               kernel_initializer='he_normal', use_bias=False)(se)
    se = Dense(filters,    activation='sigmoid',
               kernel_initializer='he_normal', use_bias=False)(se)

    return multiply([_input, se])
# Example usage
x = Conv1D(filters=64, kernel_size=4, activation='relu', kernel_initializer='he_normal')(x)
x = SqueezeExcite(x) # place after EACH Conv1D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...