【问题标题】:How can I assign a class_weight in Keras in a simple way?如何以简单的方式在 Keras 中分配一个 class_weight?
【发布时间】:2017-11-26 17:19:33
【问题描述】:

当数据集不平衡时,谁能告诉我在 Keras 中应用 class_weight 的最简单方法是什么?

我的目标中只有两个类。

谢谢。

【问题讨论】:

    标签: python tensorflow deep-learning keras


    【解决方案1】:

    类权重采用字典类型。

    from collections import Counter
    itemCt = Counter(trainGen.classes)
    maxCt = float(max(itemCt.values()))
    cw = {clsID : maxCt/numImg for clsID, numImg in itemCt.items()}
    

    【讨论】:

      【解决方案2】:

      1- 使用您的标签及其相关权重定义字典

      class_weight = {0: 0.1,
                      1: 1.,
                      2: 2.}
      

      2- 将字典作为参数提供:

      model.fit(X_train, Y_train, batch_size = 100, epochs = 10, class_weight=class_weight)
      

      【讨论】:

      • 类是从 0 还是 1 命名的?
      【解决方案3】:

      fit() 函数的class_weight 参数是将类映射到权重值的字典。

      假设您有 500 个 0 类样本和 1500 个 1 类样本,而不是您输入的 class_weight = {0:3 , 1:1}。这使 0 类的权重是 1 类的三倍。

      train_generator.classes 为您提供适当的类名称以进行加权。

      如果您想以编程方式计算,可以使用 scikit-learn 的 sklearn.utils.compute_class_weight()

      该函数查看标签的分布并生成权重,以同样惩罚训练集中代表不足或过度代表的类。

      在这里也可以看到这个有用的帖子:https://github.com/fchollet/keras/issues/1875

      这个帖子也可能有帮助:Is it possible to automatically infer the class_weight from flow_from_directory in Keras?

      【讨论】:

      • 终于有一个清晰的例子了!似乎没有其他地方能说明权重是放大还是缩小
      • 这应该是最佳答案 - 它回答了问题的内容(关于 Keras,而不是 scikit-learn),还提供了文档和解释。
      【解决方案4】:

      使用 sklearn 工具包中的 class_weight。

      我也是用这种方法来处理不平衡数据

      from sklearn.utils import class_weight
      class_weight = class_weight.compute_class_weight('balanced'
                                                     ,np.unique(Y_train)
                                                     ,Y_train)
      

      然后是model.fit

      Classifier.fit(train_X,train_Y,batch_size = 100, epochs = 10
                 ,validation_data= (test_X,test_Y),class_weight = class_weight )
      

      【讨论】:

        【解决方案5】:

        您是在询问要应用的正确权重还是如何在代码中执行此操作?代码很简单:

        class_weights = {}
            for i in range(2):
                class_weights[i] = your_weight
        

        然后你在model.fit 中传递参数class_weight=class_weights

        使用的正确权重是某种逆频率;你也可以做一些试验和错误。

        【讨论】:

        • 谢谢,这就是我要找的东西
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 2018-06-23
        • 2017-09-13
        • 2021-12-05
        • 1970-01-01
        相关资源
        最近更新 更多