私は20+ GBの周りにtensorflow kerasシーケンシャルモデルを訓練していますDBのpostgresのテキストベースのカテゴリーデータと私はモデルにクラスの重みを与える必要があります。ここで私はやっているものです。
class_weights = sklearn.utils.class_weight.compute_class_weight('balanced', classes, y)
model.fit(x, y, epochs=100, batch_size=32, class_weight=class_weights, validation_split=0.2, callbacks=[early_stopping])
私はメモリ内全体をロードすることはできませんので、私は私が使用することができます考え出しfit_generatorの kerasモデルに方法を。
しかし、どのように私はすることができますクラスの重み計算このデータには?sklearnはこのために特別な機能を提供していない、それはこのための適切なツールですか?
私は、複数の上でそれをやって考えランダムサンプルが、より良いアプローチがあり、全体のデータを使用することができますか?
あなたは、発電機を使用することができ、また、あなたはクラスの重みを計算することができます。
あなたはこのようなあなたの発電機を持っているとしましょう
train_generator = train_datagen.flow_from_directory(
'train_directory',
target_size=(224, 224),
batch_size=32,
class_mode = "categorical"
)
そして、トレーニングセットのためのクラスの重みは次のように計算することができます
class_weights = class_weight.compute_class_weight(
'balanced',
np.unique(train_generator.classes),
train_generator.classes)
あなたはpostgresの約言及したので、[EDIT 1]は、私がここにプロトタイプの答えを追加してい、コメント内のSQL。
最初のPostgresのSQLから別のクエリを使用して、各クラスのカウントを取得し、クラスの重みを計算するためにそれを使用。手動で計算することができます。基本的なロジックは最低重量を測定し、クラスのカウントが値1、およびクラスの残りの部分は少なくとも秤量クラスの相対数に基づいて<1を取得する取得です。
例えば、あなたは、3つのクラスA、Bを有し、100200150の、クラス量を有するCになる{A 1、B:0.5、C:0.66}
手動でPostgresのSQLから値を取得した後、それを計算してみましょう。
[クエリ]
cur.execute("SELECT class, count(*) FROM table group by classes order by 1")
rows = cur.fetchall()
上記のクエリは、少なくともから最高に命じた(クラス名、各クラスのカウント)タプルで行を返します。
そして、線の下の意志コードは、クラスの重み辞書を作成します
class_weights = {}
for row in rows:
class_weights[row[0]]=rows[0][1]/row[1]
#dividing the least value the current value to get the weight,
# so that the least value becomes 1,
# and other values becomes < 1