Поддерживает ли объединение tenorflow динамический размер пакета c? - PullRequest
0 голосов
/ 16 апреля 2020

Поддерживает ли тензор-федеративное назначение разных размеров партии для разных моделируемых устройств и изменения размера партии для разных эпох?

1 Ответ

0 голосов
/ 20 апреля 2020

TFF поддерживает динамический c размер пакета - это кодируется на уровне сигнатуры типа в атрибуте shape tff.TensorType. Любое измерение с соответствующей формой None будет динамическим c. Если у вас есть tff.learning.Model, атрибут input_spec должен иметь размер None для любого измерения, которое будет sh динамическим c.

Точный правильная сигнатура типа спецификации зависит от того, что именно вы собираетесь делать с этими динамическими c фигурами. Вот краткий пример, который может проиллюстрировать немного больше:

Предположим, у вас есть модель Keras model и tff.simulation.ClientData объект client_data. Аргумент input_spec для tff.learning.from_keras_model заполняет tff.learning.Model input_spec напрямую, поэтому именно здесь вы wi sh можете указать, что размер вашего пакета может варьироваться:

input_spec = collections.OrderedDict(
    x=tf.TensorSpec(dtype=tf.float32, shape=[None, 784]),
    y=tf.TensorSpec(dtype=tf.int64, shape=[None]),
)

def model_fn():
  tff_model = tff.learning.from_keras_model(
      keras_model=model,
      input_spec=input_spec,
      # other args,...
  )

Затем, внутри вашего Python тренинга по вождению l oop, вы можете использовать разные размеры партий в разных раундах обучения (или даже в одном и том же раунде, я полагаю), например, (если предположить, что мы написали функцию с именем _whatever_batch_size_I_want, который принимает число раунда в качестве аргумента и возвращает любой размер пакета, подходящий для этого раунда):

fedavg_process = tff.learning.build_federated_averaging_process(
    model_fn=model_fn, # other args, ...)

state = fedavg_process.initialize()

for k in range(NUM_ROUNDS):
  batch_size = _whatever_batch_size_you_want(k)
  sampled_client_ids = random.choices(
      client_data.client_ids, k=NUM_CLIENTS_PER_ROUND)
  client_datasets = [
      client_data.create_tf_dataset_for_client(x) for x in sampled_client_ids]
  batched_client_datasets = [ds.batch(batch_size) for ds in client_datasets]
  state = fedavg_process.next(state, batched_client_datasets)

Вы можете делать даже более изящные вещи с динамическими c формами и входными аргументами c при желании; Например, вы можете обучить модель обработки последовательности, которая принимает последовательности переменной длины, указав также размер последовательности, имеющий размер None.

...