Внедрить генератор данных в федеративное обучение - PullRequest
4 голосов
/ 21 января 2020

(я разместил вопрос на https://github.com/tensorflow/federated/issues/793 и, возможно, также здесь!)

Я настроил свои собственные данные и модель для федеративных интерфейсов, и обучение сблизилось. Но меня смущает проблема, связанная с тем, что в задаче классификации изображений весь набор данных является чрезвычайно большим, и его нельзя ни сохранить в одном federated_train_data, ни импортировать в память один раз. Поэтому мне нужно загружать набор данных с жесткого диска партиями в оперативную память и использовать во время обучения Keras model.fit_generator вместо model.fit, который люди используют для работы с большими данными.

Полагаю, в iterative_process показано в учебнике по классификации изображений, модель устанавливается на фиксированный набор данных. Есть ли способ настроить код, чтобы он соответствовал генератору данных? Я изучил исходные коды, но все еще в замешательстве. Был бы невероятно благодарен за любые подсказки.

Ответы [ 2 ]

1 голос
/ 22 января 2020

Как правило, TFF рассматривает подачу данных как часть «Python драйвера l oop», что полезно при написании кода TFF.

Фактически, при записи TFF, как правило, существует три уровня, на которых можно писать:

  1. TensorFlow, определяющий локальную обработку (IE, обработку, которая будет выполняться на клиентах, или на сервере, или в агрегаторах, или в любом другом месте размещения может потребоваться, но только одиночное размещение.
  2. Собственный TFF, определяющий способ передачи данных по местам размещения. Например, запись tff.federated_sum внутри tff.federated_computation декоратора; при написании этой строки объявляется "эти данные перемещаются с клиентов на сервер и агрегируются с помощью оператора суммы".
  3. Python "управляя" TFF l oop, например, запуск одного раунда. Задачей этого последнего уровня является выполнение «реальной» федеративной среды обучения; одним из примеров здесь будет выбор клиентов для данного раунда.

Если эта разбивка учитывается, использование генератора или какой-либо другой конструкции в стиле ленивых вычислений для подачи данных в федеративные вычисления становится относительно простым; это просто делается на уровне Python.

Один из способов сделать это - использовать метод create_tf_dataset_for_client для объекта ClientData; если вы наберете oop раундов, ваш код Python может выбрать из списка client_ids, затем вы можете создать новый список tf.data.Datasets и передать их в качестве нового набора данных клиента. Примером этого относительно простого использования может быть здесь и более сложное использование (включающее определение пользовательского client_datasets_fn, который принимает client_id в качестве параметра, и передачу его в отдельно определенное обучение l oop будет здесь , в коде, связанном с этой статьей .

Последнее замечание: создание экземпляра tf.data.Dataset фактически не загружает набор данных в память; набор данных загружается только после итерации. Один полезный совет, который я получил от ведущего автора tf.data.Dataset, состоит в том, чтобы думать о tf.data.Dataset скорее как о «рецепте набора данных», чем о буквальном создании самого набора данных. Было высказано предположение, что, возможно, лучшим названием было бы DataSource для этой конструкции, возможно, это поможет ментальной модели того, что происходит на самом деле. Точно так же использование объекта tff.simulation.ClientData обычно не должно ничего загружать в память до тех пор, пока повторяется при обучении клиентов, что должно упростить некоторые нюансы в управлении памятью набора данных.

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

это должны быть tf.data.dataset.from_tensor_slices? или другое?

...