Как преодолеть дисбаланс классов во временных данных для определения слова триггера - PullRequest
0 голосов
/ 11 октября 2018

У меня есть ГРУ, который я тренирую, чтобы обнаружить определенное слово.

Я сгенерировал более 500 примеров этого слова триггера (1-секундные клипы) и 500 примеров слов, которые являются отрицательными.Я скомбинировал эти 5 секундных фоновых клипов, чтобы создать 10000 примеров.Из этих примеров я сделал наборы данных для обучения, проверки и тестирования.

ГРУ пытается предсказать, было ли только что произнесено слово запуска.Но в каждом образце присутствует большой дисбаланс классов.


Один пример для ясности, показанный ниже


Ввод (1, 2754, 101) ---> (пример#, # входных временных шагов, # частот)

Метка / Выход составляет (1, 685, 1) ---> (пример #, # временных шагов вывода, 1 или 0 в зависимости от того,Недавно было сказано слово запуска.


Проблема заключается в том, что приблизительно 93% временных шагов для данного примера помечены 0, а не 1. В зависимости от примера вы выбираете 7% выходных шагов, которыепомечены как те, которые могут находиться где угодно в выходных данных. В настоящее время, если я просто запускаю сеть как есть, сеть просто учится предсказывать все как 0.

Как мне решить эту проблему?

Я внимательно следил за использованием sample_weight, sample_weight_mode = 'temporal и class_weights (хотя я считаю, что это не работает для 3D-выходов).

Я также исследовал создание пользовательской функции потерь, которая вычисляет F1sядро, но я нервничаю из-за того, что копаю в этом глубоко.

Если бы кто-то мог указать мне правильное направление, я был бы очень благодарен.

Спасибо!

Edit Вот строки компиляции и подгонки моего кода для ясности

opt = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.01)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=["accuracy"])
history = model.fit(x=X, y=Y, batch_size=100, epochs=100, verbose=1, callbacks=callback_list, validation_data=(X_val, Y_val), shuffle=True)

...