Если вы хотите проверить значения на клиентах здесь, есть несколько способов представить это.
Можно было бы использовать tf.print
op внутри local_train
, если это функция - это tff.tf_computation
, что, на мой взгляд, здесь не так.
Другой вариант - вытащить вызовы функций немного больше, поэтому вместо записи tff.federated_mean(tff.federated_map(local_train...))
мы могли бы write
train_results_on_clients = tff.federated_map(local_train...)
aggregated_result =tff.federated_mean(train_results_on_clients)
Затем, если внешняя функция возвращает оба этих значения, значение, материализованное во время выполнения Python, представляющее train_results_on_clients
, будет результатом запуска одного раунда обучения на всех клиентах, представлен в виде списка с одной записью на клиента; TFF позволяет вам делать это так же, как вы можете проверять промежуточные значения функции, возвращая их.
Одна вещь, которая будет не работать, - вставить оператор печати Python внутри федеративные вычисления; это будет выполнено только во время трассировки по тем же причинам, по которым необходимо использовать tf.print
вместо Python печати внутри графиков TF (по крайней мере, без автографа).
Что касается tff.sequence_reduce
, его цель в действительности состоит в том, чтобы продемонстрировать локальность вычислений c дизайн TFF; В данном случае, модель обучения l oop может быть записана способом TensorFlow как c как локальный механизм вычислений.
Надеюсь, это поможет!