Как уменьшить переоснащение в нейронных сетях? - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над проектом по распознаванию звука.

У меня 1500 помеченных звуковых сэмплов 5 классов. (300 звуковых образцов длительностью 2 секунды для каждого класса).

Я использую онлайн-инструмент для расчета коэффициентов MF CC (импульс Egde) (поэтому я не могу предоставить код) и затем я тренирую нейронную сеть.

Набор данных разбит:

  • 80% -> тренировочный набор, который разбит 80/20 - обучение / проверка

  • 20% -> набор тестов

После 200 тренировочных циклов первый выпуск моей сети имел (очень плохие) следующие выступления:

точность обучения = 100% / точность проверки = 30%

В результате поиска по net и на этом форуме я нашел способ (ы) уменьшения переобучения:

Окончательная производительность моего последнего выпуска нейронной сети следующая:

точность обучения = 80% / точность проверки = 60% (после 200 циклов обучения)

Как вы можете видеть , все еще существует значительная разница между точностью обучения и точностью проверки ..

У меня вопрос, как продолжать повышать точность проверки?

код моей нейронной сети:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout, Conv1D, Flatten, Reshape, MaxPooling1D, BatchNormalization
from tensorflow.keras import regularizers
from tensorflow.keras.optimizers import Adam

# model architecture
model = Sequential()
model.add(InputLayer(input_shape=(X_train.shape[1], ), name='x_input'))
model.add(Reshape((int(X_train.shape[1] / 13), 13), input_shape=(X_train.shape[1], )))
model.add(Conv1D(30, kernel_size=1, activation='relu',kernel_regularizer=regularizers.l2(0.001)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=1, padding='same'))
model.add(Conv1D(10, kernel_size=1, activation='relu',kernel_regularizer=regularizers.l2(0.001)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=1, padding='same'))
model.add(Flatten())
model.add(Dense(classes, activation='softmax', name='y_pred'))

# this controls the learning rate
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
#opt = Adadelta(learning_rate=1.0, rho=0.95)

# train the neural network
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=50, epochs=200, validation_data=(X_test, Y_test), verbose=2)

Спасибо,

С уважением,

Лайонел

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

В целом, чтобы уменьшить переоснащение, вы можете сделать следующее:

  1. Добавить больше регуляризации (например, несколько слоев отсева с более высокими показателями отсева)
  2. Уменьшить количество функций
  3. Уменьшить пропускную способность сети (например, уменьшить количество слоев или количество скрытых единиц)
  4. Уменьшить размер пакета
0 голосов
/ 15 апреля 2020
  1. Попробуйте с проверкой на стратифицированную K-складку это
  2. выберите другой размер партии {16,32,64}
  3. Попробуйте с сигмоидом
  4. BatchNormalization ()
...