Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python keras从类上或类下的\u目录中流出\u_Python_Machine Learning_Neural Network_Deep Learning_Keras - Fatal编程技术网

Python keras从类上或类下的\u目录中流出\u

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内置方法无法平衡数据集。

我试图用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类重量如何增加该批样品的影响?我怀疑这比想象的要复杂得多。