keras flow_from_directory对类进行过采样或欠采样

Geo*_*rge 12 python machine-learning neural-network deep-learning keras

我正在尝试使用Keras进行二进制分类问题,使用该ImageDataGenerator.flow_from_directory方法生成批处理.但是,我的类非常不平衡,比如在一个类中比另一个类大约多8倍或9倍,导致模型卡住为每个示例预测相同的输出类.有没有办法在flow_from_directory我的小班上设置过采样,或者在每个纪元期间从我的大班中设置欠采样?现在,我刚刚在我的小班级中创建了每个图像的多个副本,但我希望有更多的灵活性.

Mar*_*jko 12

使用当前版本的Keras - 仅使用Keras内置方法无法平衡数据集.该flow_from_directory简直是建设的所有文件和自己的班级名单,洗牌(如果需要),然后它遍历它.

但是你可以做一个不同的技巧 - 通过编写你自己的生成器来实现平衡python:

def balanced_flow_from_directory(flow_from_directory, options):
    for x, y in flow_from_directory:
         yield custom_balance(x, y, options)
Run Code Online (Sandbox Code Playgroud)

这里custom_balance应该是一个函数,给定批处理(x, y)是平衡它并返回平衡批处理(x', y').对于大多数应用程序,批处理的大小不需要相同 - 但是有一些奇怪的用例(例如有状态的 RNN) - 批处理大小应该具有固定的大小).

  • 有人可以基于此创建一个完全可用的脚本,详细说明吗?我需要一个更具体的custom_balance例子等. (3认同)

小智 7

您可以做的一件事是class_weight在调用model.fit()或时设置参数model.fit_generator()

碰巧您还可以使用sklearnnumpy库轻松计算 class_weights ,如下所示:

from sklearn.utils import class_weight
import numpy as np

class_weights = class_weight.compute_class_weight(
           'balanced',
            np.unique(train_generator.classes), 
            train_generator.classes)
Run Code Online (Sandbox Code Playgroud)

之后,它变得就像设置您的class_weights等于class_weight参数一样简单:

model.fit_generator(..., class_weight=class_weights) 
Run Code Online (Sandbox Code Playgroud)

  • 你怎么能保证 `np.unique(train_generator.classes)` 会以正确的顺序返回类? (5认同)