tl;博士我正在构建一个二进制分类器,它总是最终在一定数量的时期后预测所有“0”或所有“1”,我正在寻找可能的原因/如何继续。
以下是有关我的方法和想法的更多详细信息:
我在做什么:我正在构建一个二进制分类基本前馈神经网络,用于使用 tensorflow 进行信号处理。
我通过将数据分成长度为 window_size 点(比如 50)的“窗口”来预处理我的数据,并且该窗口/示例可以被认为是“1”(正)或“0”(负)。官方手动标注的标签位于特定点(例如 403、875、1450 等),并且间隔相对均匀。如果窗口包含标签,我决定我的示例/窗口为正,否则为负。通过将窗口移动一些 stride_length(例如 1、2 或 10 个点等)生成多个示例,直到我的移动窗口到达信号的末尾。
对于训练数据,由于我的大多数示例都是负数,因此我尝试将 neg 与 pos 示例的比率标准化,使其接近 1:1。我通过删除负样本的计算比率来做到这一点。对于测试数据,我跳过了最后一步,但其他一切都是一样的。
我通过 3 层 NN 运行它,RELU 在隐藏层上,sigmoid 在唯一输出上,<0.5 预测负数,>0.5 预测正数。成本是(标签 - 预测)^2 的总和,使用默认 LR (0.001) 的 AdamOptimizer。
我的问题: 无论我调整什么参数,我的 NN 似乎在一定数量的时期后(有时甚至在第一个时期立即)预测所有内容为负或正。也蛮随意的。我会多次运行同一件事,每次都会得到不同的结果,大约一半的预测都是正面的,另一半都是负面的。
我尝试过/想过的事情:
- 在训练我的模型之前,我对训练示例进行了洗牌,没有太大的改进。
- 如上所述,我减少了负面示例,因为在减少之前我遇到了这个问题(基本上立即预测所有负面示例)。但现在我有接近 1:1 的 pos/neg 示例,它在预测所有负数和所有正数之间翻转,所以它对这个比率非常敏感。
- 我最初有一个带有 one-hot 编码的 softmax_cross_entropy_with_logits 成本函数,所以 0 1 是正数,而 1 0 是负数。(我想也许成本函数会奖励极端预测,所以我改用平方和,它更苛刻)
- 我正在考虑尝试批量标准化和辍学,但我不希望这些能解决我的问题。
- 我认为问题可能在于我如何预处理数据。我的思考过程是这样的:如果 pos/neg 示例的比率如此重要,以至于它使我的模型预测所有正面或全部负面,那么我的数据中可能没有真正的趋势(这是错误的,因为任何有眼睛的人都可以看到不同)。我的想法是,因为我有一个移动窗口,所以有时标签靠近移动窗口的左边缘,有时靠近右边缘,这意味着实际感兴趣的区域每次都输入到不同的神经元中,这会使神经元感到困惑,所以感觉没有真正的趋势。
- 但是,我查看了权重和偏差,它们似乎在几个时期后趋于稳定。如果数据真的没有趋势,他们不应该还在疯狂地跳来跳去吗?也许那是错误的。
- 我正在考虑通过不同的神经网络运行左倾标签示例和右倾标签示例来测试我的假设,看看我是否能得到更好的结果,但也许不值得付出努力。
我已经尝试了一段时间,似乎想不出一个好的解释或方法。我非常感谢我能得到的任何帮助,我很乐意提供更多信息。谢谢!