【问题标题】:Keras multi-class prediction output is limited to one classKeras多类预测输出仅限于一类
【发布时间】:2017-08-27 16:15:02
【问题描述】:

我构建了一个包含 35000 个输入样本和 20 个预测变量的顺序 keras 模型,测试数据输出类分布为:

  • Class_0 = 5.6%
  • Class_1 = 7.7%
  • Class_2 = 35.6%
  • Class_3 = 45.7%
  • Class_4 = 5.4%

利用 (np_utils.to_categorical) 将输出转换为二进制类矩阵后,训练准确度约为 54%,当我对测试数据(15000 个样本)进行模型拟合时,所有预测 (100%) 恰好是相同的属于class_3“训练输出中出现次数最多”的类,这种偏差的原因是什么,并且对其他类没有单一的预测?如何使模型对预测更少的类别敏感并提高准确率,尤其是在训练数据的并发度较低(例如 1 - 3%)的情况下。

model = Sequential()
model.add(Dense(40, input_dim=20,  activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10,  activation='relu'))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

model.fit(X, Y, epochs=500,  verbose=1)

【问题讨论】:

    标签: tensorflow neural-network keras


    【解决方案1】:

    重新平衡损失的最简单方法是:

    1. 定义一个class_weights 字典:

      class_weights_dict = {0: 1.0 / 0_class_freq, 1: 1.0 / 1_class_freq, ... }
      

      其中i_class_freqi-th 类的频率。

    2. 将您的 fit 函数更改为:

      model.fit(X, Y, epochs=500,  verbose=1, class_weight=class_weights_dict)
      

    上面定义的模型应该等同于您的带有贝叶斯重加权类的模型。

    【讨论】:

      【解决方案2】:

      解决的一种方法是在表示的类示例下过采样。 即,如果您有两个类别 A(66.6%)和 B(33.3%),那么与 A 相比,您对 B 进行两次抽样。 为了更简单,您可以通过复制 B 一次并使数据集类似于 A+2*B 来更改数据集。

      或者,您可以修改损失函数,以便在对代表不足的类进行错误分类时赋予更大的权重。

      【讨论】:

      • vikasreddy,提建议。您能否详细说明修改损失函数以赋予更多权重,对于问题的第一部分,任何解释为什么网络忽略预测其他类的其余部分(54.3%),特别是具有大量观察的 class_2(35 %) ??
      • 我能想到的一个原因是模型不够复杂,无法完全最小化损失函数,因此它保持在局部最小值,恰好预测所有示例都在 class_3 中。
      猜你喜欢
      • 1970-01-01
      • 2020-08-04
      • 2018-02-16
      • 2018-01-12
      • 2020-11-10
      • 2021-12-10
      • 2017-06-02
      • 2015-08-11
      • 2018-02-17
      相关资源
      最近更新 更多