2017-01-23 38 views
5

ImageDataGenerator.flow_from_directoryメソッドを使用して、バラフを生成するKerasでバイナリ分類の問題を解決しようとしています。しかし、私のクラスは非常に不均衡で、あるクラスでは他のクラスに比べて約8倍または9倍多く、モデルはすべての例で同じ出力クラスを予測できなくなってしまいます。 flow_from_directoryを小規模なクラスからオーバーサンプリングするか、各エポックの間に大きなクラスのアンダーサンプルに設定する方法はありますか?現時点では、私は小規模なクラスで複数の画像を作成していますが、もう少し柔軟性を持たせたいと思います。keras flow_from_directoryクラスをオーバーサンプルまたはアンダーサンプルする

答えて

6

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) 

custom_balanceバッチ(x, y)はそれのバランスをとると返している与えられた関数であるべき平衡バッチ(x', y')。ほとんどのアプリケーションでは、バッチサイズは同じである必要はありませんが、バッチサイズは固定サイズにする必要があります(たとえばstateful RNNなど)。

+0

を正常化することができ、これは私が – George

+1

必要な約何のようだおかげで誰かが詳しく説明し、これに基づいて完全に動作するスクリプトを作成できますか?私はcustom_balanceなどの具体的な例が必要です – mikal94305

0

また、各クラス内のファイルの数を計算し、class_weights

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) 
+0

サンプルコードと詳細な説明を追加してください –

+0

答えを編集してこのコードを追加してください –

関連する問題