Tensorflow Federated Learning(TFF)のkerasモデルでclass_weightを使用できますか?

Aug 23 2020

私のデータセットはクラスが不均衡であるため、class_weightを使用して、分類子がマイナークラスに重みを付けることができるようにします。一般的な設定では、次のようにクラスの重みを割り当てることができます。

weighted_history = weighted_model.fit(
    train_features,
    train_labels,
    batch_size=BATCH_SIZE,
    epochs=EPOCHS,
    callbacks=[early_stopping],
    validation_data=(val_features, val_labels),
    # The class weights go here
    class_weight=class_weight) 

TensorFlowフェデレーション学習でclass_weightを割り当てる方法はありますか?連合学習の私のコードは以下のとおりです。

def create_keras_model(output_bias=None):
    return tf.keras.models.Sequential([
        tf.keras.layers.Dense(12, activation='relu', input_shape(5,)),
        tf.keras.layers.Dense(8, activation='relu'),
        tf.keras.layers.Dense(5, activation='relu'),
        tf.keras.layers.Dense(3, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')])

def model_fn():
    keras_model = create_keras_model()
    return tff.learning.from_keras_model(
        keras_model,
        input_spec=preprocessed_example_dataset.element_spec,
        loss=tf.keras.losses.BinaryCrossentropy(),
        metrics=[tf.keras.metrics.BinaryAccuracy()])

回答

2 JakubKonecny Aug 24 2020 at 20:47

直接ではありません。主な問題は、このtf.keras.Model.fit方法が分散データからのトレーニングのアイデアに概念的にマッピングされていないことです。

これをで機能させたい場合TFF、最初のステップは、実行する必要のあるアルゴリズムを決定することです。私が見る限り、これには明確な答えはありません。たとえば、class_weightsデータに直接アクセスできない場合、どのようにしてそれらを判断しますか?

しかし、その情報が何らかの形で利用可能であり、単にクライアントでのローカルトレーニング手順を変更したいとします。から始めてexamples/simple_fedavg、それを実現する方法は、このループで勾配が計算される方法を適切に変更することです。