Низкая точность оценки Re snet в TensorFlow Federated - PullRequest
0 голосов
/ 13 февраля 2020

Я реализовал модель Resnet34 в руководстве по классификации федеративных изображений. После 10 раундов точность обучения может быть выше 90%, однако точность оценки с использованием state.model последнего раунда всегда составляет около 50%.

    evaluation = tff.learning.build_federated_evaluation(model_fn)
    federated_test_data = make_federated_data(emnist_test, sample_clients)
    test_metrics = evaluation(state.model, federated_test_data)
    str(test_metrics)

Я очень смущен, что, возможно, не так с оценкой часть? Кроме того, я напечатал неизменяемые переменные (среднее значение и дисперсию в BatchNorm) модели сервера, которые равны 0 и 1 без обновлений / усреднений после этих раундов. Должны ли они быть такими или такими могут быть проблемы? Огромное спасибо!

Обновления:

Коды для подготовки данных об обучении и печатных результатов:

len(emnist_train.client_ids)
4

emnist_train.element_type_structure
OrderedDict([('label', TensorSpec(shape=(), dtype=tf.int64, name=None)),('pixels',TensorSpec(shape=(256, 256, 3), dtype=tf.float32, name=None))])


NUM_CLIENTS = 4
NUM_EPOCHS = 1
BATCH_SIZE = 30
SHUFFLE_BUFFER = 500

def preprocess(dataset):
  def element_fn(element):
    return collections.OrderedDict([
        ('x', element['pixels']),
        ('y', tf.reshape(element['label'], [1])),
    ])
  return dataset.repeat(NUM_EPOCHS).map(element_fn).shuffle(
      SHUFFLE_BUFFER).batch(BATCH_SIZE)



sample_clients = emnist_train.client_ids[0:NUM_CLIENTS]

federated_train_data = make_federated_data(emnist_train, sample_clients)

preprocessed_example_dataset = preprocess(example_dataset)

sample_batch = tf.nest.map_structure(
    lambda x: x.numpy(), iter(preprocessed_example_dataset).next())

def make_federated_data(client_data, client_ids):
      return [preprocess(client_data.create_tf_dataset_for_client(x))
          for x in client_ids]



len(federated_train_data), federated_train_data[0]
(4,<BatchDataset shapes: OrderedDict([(x, (None, 256, 256, 3)), (y, (None, 1))]), types: OrderedDict([(x, tf.float32), (y, tf.int64)])>)

Коды обучения и оценки:

 def create_compiled_keras_model():
  base_model = tf.keras.applications.resnet.ResNet50(include_top=False, weights='imagenet', input_shape=(256,256,3,))
  global_average_layer = tf.keras.layers.GlobalAveragePooling2D()
  prediction_layer = tf.keras.layers.Dense(2, activation='softmax')

  model = tf.keras.Sequential([
                               base_model,
                               global_average_layer,
                               prediction_layer
                               ])
  model.compile(optimizer = tf.keras.optimizers.SGD(lr = 0.001, momentum=0.9), loss = tf.keras.losses.SparseCategoricalCrossentropy(), metrics = [tf.keras.metrics.SparseCategoricalAccuracy()])
  return model

def model_fn():
  keras_model = create_compiled_keras_model()
  return tff.learning.from_compiled_keras_model(keras_model, sample_batch)
iterative_process = tff.learning.build_federated_averaging_process(model_fn)
state = iterative_process.initialize()
for round_num in range(2, 12):
  state, metrics = iterative_process.next(state, federated_train_data)
  print('round {:2d}, metrics={}'.format(round_num, metrics, state))


evaluation = tff.learning.build_federated_evaluation(model_fn)
federated_test_data = make_federated_data(emnist_test, sample_clients)

len(federated_test_data), federated_test_data[0]
(4,
 <BatchDataset shapes: OrderedDict([(x, (None, 256, 256, 3)), (y, (None, 1))]), types: OrderedDict([(x, tf.float32), (y, tf.int64)])>)

test_metrics = evaluation(state.model, federated_test_data)
str(test_metrics)

Результаты тренировок и оценок после каждого раунда:

round  1, metrics=<sparse_categorical_accuracy=0.5089045763015747,loss=0.7813001871109009,keras_training_time_client_sum_sec=0.008826255798339844>

<sparse_categorical_accuracy=0.49949443340301514,loss=8.0671968460083,keras_training_time_client_sum_sec=0.0>


round  2, metrics=<sparse_categorical_accuracy=0.519825279712677,loss=0.7640910148620605,keras_training_time_client_sum_sec=0.011750459671020508>

<sparse_categorical_accuracy=0.49949443340301514,loss=8.0671968460083,keras_training_time_client_sum_sec=0.0>


round  3, metrics=<sparse_categorical_accuracy=0.5099126100540161,loss=0.7513422966003418,keras_training_time_client_sum_sec=0.0039823055267333984>

<sparse_categorical_accuracy=0.49949443340301514,loss=8.0671968460083,keras_training_time_client_sum_sec=0.0>


round  4, metrics=<sparse_categorical_accuracy=0.5278897881507874,loss=0.7905193567276001,keras_training_time_client_sum_sec=0.0010638236999511719>

<sparse_categorical_accuracy=0.49949443340301514,loss=8.0671968460083,keras_training_time_client_sum_sec=0.0>


round  5, metrics=<sparse_categorical_accuracy=0.5199933052062988,loss=0.7782396674156189,keras_training_time_client_sum_sec=0.012729644775390625>

<sparse_categorical_accuracy=0.49949443340301514,loss=8.0671968460083,keras_training_time_client_sum_sec=0.0>

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Я обнаружил, что инициализация - причина того, что Re sNet имеет низкую производительность. Возможно, это связано с тем, что ttf использует относительно простую инициализацию состояния, которая не учитывает некоторые уровни, такие как пакетная норма, поэтому, когда я назначил серверу начальные веса нормальной модели Keras вместо использования инициализации по умолчанию, результаты объединения были намного лучше.

0 голосов
/ 14 февраля 2020

В Федеративном обучении есть несколько нюансов и несколько открытых исследовательских проблем, и этот вопрос затронул пару из них.

  1. Потеря обучения выглядит много лучше, чем потери при оценке : при использовании федеративного усреднения (алгоритм оптимизации, используемый в учебном пособии Федеративное обучение по классификации изображений ) необходимо тщательно интерпретировать метрики, поскольку они имеют нюансы, отличающиеся от централизованного обучения модели , Особенно тренировочный урон , который является средним по многим шагам последовательности или партиям. Это означает, что после одного раунда каждый клиент может очень хорошо приспособить модель к своим локальным данным (получая высокую точность), но после усреднения этих обновлений в глобальной модели глобальная модель все еще может быть далека от «хорошей», что приводит к низкая точность теста. Кроме того, 10 раундов может быть слишком мало; одна из оригинальных научных работ c по Федеративному обучению продемонстрировала как минимум 20 раундов с точностью до 99% ( McMahan 2016 ) с данными IID и более 100 раундов с данными без IID.

  2. BatchNorm в федеративном параметре : это открытая исследовательская задача о том, как объединить параметры группы, в частности с данными клиента, не относящимися к IID. Должен ли каждый новый клиент начинаться с параметров fre sh или получать глобальные параметры модели? TFF может не связывать их между сервером и клиентом (поскольку в настоящее время он реализован только для обмена обучаемыми переменными) и может привести к неожиданному поведению. Может быть, нам стоит напечатать параметры state, чтобы посмотреть, что происходит с ними каждый раунд.

...