如何克服时间数据中的类不平衡以进行触发字检测

时间:2018-10-11 12:20:30

标签: python triggers lstm rnn temporal

我有一个正在训练的GRU,用于检测特定的单词。

我已经生成了500个以上的触发词示例(1个第二剪辑)和500个否定词示例。我结合了这些5秒背景素材的片段,以创建10000个示例。从这些示例中,我进行了训练,验证和测试数据集。

GRU试图预测触发词是否刚刚被说出。但是每个样本中都有很大的类不平衡。


下面显示的一个清晰示例


输入为(1、2754、101)--->(例如#,输入时间步长#,频率#

标签/输出为(1,685,1)--->(示例#,输出时间步长的#,1或0,取决于最近是否说过触发字。


问题在于,给定示例中大约93%的时间步长被标记为0,而不是1。根据示例,您选择了被标记为1的输出步长的7%,可以位于输出中的任何位置。目前,如果我仅按原样运行网络,则该网络只会学习将所有内容预测为0。

我应该如何解决这个问题?

我专心研究了使用sample_weight,sample_weight_mode ='temporal和class_weights(尽管我认为它不适用于3D输出)。

我还研究了制作自定义损失函数来计算F1分数的方法,但我对此深表担忧。

如果有人能指出我正确的方向,我将不胜感激。

谢谢!

编辑 为了清楚起见,这是我的代码的编译和匹配行

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)

0 个答案:

没有答案