Python keras从类上或类下的\u目录中流出\u
我试图用Keras做一个二进制分类问题,使用Python keras从类上或类下的\u目录中流出\u,python,machine-learning,neural-network,deep-learning,keras,Python,Machine Learning,Neural Network,Deep Learning,Keras,我试图用Keras做一个二进制分类问题,使用ImageDataGenerator.flow\u from\u directory方法生成批。然而,我的类是非常不平衡的,比如一个类比另一个类多8倍或9倍,导致模型无法预测每个示例的相同输出类。是否有一种方法可以将flow\u from\u directory设置为在每个时间段内从我的小班过采样或从大班欠采样?现在,我刚刚在我较小的类中创建了每个图像的多个副本,但我希望有更多的灵活性。对于当前版本的Keras,仅使用Keras内置方法无法平衡数据集。
ImageDataGenerator.flow\u from\u directory
方法生成批。然而,我的类是非常不平衡的,比如一个类比另一个类多8倍或9倍,导致模型无法预测每个示例的相同输出类。是否有一种方法可以将flow\u from\u directory
设置为在每个时间段内从我的小班过采样或从大班欠采样?现在,我刚刚在我较小的类中创建了每个图像的多个副本,但我希望有更多的灵活性。对于当前版本的Keras,仅使用Keras内置方法无法平衡数据集。来自目录的flow\u
只是构建一个所有文件及其类的列表,将其洗牌(如果需要),然后在其上迭代
但是你可以做一个不同的技巧——编写你自己的生成器,在python
中实现平衡:
def balanced_flow_from_directory(flow_from_directory, options):
for x, y in flow_from_directory:
yield custom_balance(x, y, options)
这里的
custom\u balance
应该是一个函数,给定一个批(x,y)
对其进行平衡,并返回一个平衡的批(x',y')
。对于大多数应用程序,批处理的大小不需要相同,但是存在一些奇怪的用例(例如RNN),其中批处理大小应该有一个固定的大小。您还可以计算每个类中的文件数并规范化类权重
files_per_class = []
for folder in os.listdir(input_foldr):
if not os.path.isfile(folder):
files_per_class.append(len(os.listdir(input_foldr + '/' + folder)))
total_files = sum(files_per_class)
class_weights = {}
for i in xrange(len(files_per_class)):
class_weights[i] = 1 - (float(files_per_class[i]) / total_files)
print (class_weights)
...
...
...
model.fit_generator(... ,class_weight=class_weights)
调用
model.fit()
或model.fit\u生成器()
时,可以设置class\u weight
参数
您还可以使用sklearn
和numpy
库轻松计算类权重,如下所示:
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)
之后,设置class_权重
等于class_权重
参数就变得非常简单:
model.fit_generator(..., class_weight=class_weights)
您如何保证
np.unique(train\u generator.classes)
将以正确的顺序返回类?嘿,我知道这是一个古老的答案,但我遇到了这个问题,喜欢这个解决方案。上面提到的有一个问题:os.listdir不能保证按字母顺序返回,但是来自目录的flow\u会返回;我使用的解决方案是:lst=os.lisdir(input\u foldr);lst.sort();然后按照(希望)与来自目录的flow_相同的顺序对这些权重进行排序。我仍然担心单个批次(例如32个样本)会被平衡。如果所有样本都来自一个类别(可能是非常不平衡的数据集),那么权重将仅用于按权重过大的类别方向对这些样本进行分类。如果一批碰巧有一个稀有样品,那么U类重量如何增加该批样品的影响?我怀疑这比想象的要复杂得多。