Адаптация существующей модели keras с несколькими входами к федеративному тензорному потоку
Я пытаюсь применить федеративное обучение к существующей модели keras, которая требует двух входов. Когда я звоню tff.learning.from_compiled_keras_model
и включить пустышку, я получаю эту ошибку: ValueError: Layer model_1 expects 2 inputs, but it received 1 input tensors. Inputs received: [<tf.Tensor 'packed:0' shape=(2, 20) dtype=int64>]
,
Модель принимает два входных массива в качестве входных данных, поэтому я определил свой dummy_batch следующим образом:
x = tf.constant(np.random.randint(1,100, size=[20]))
collections.OrderedDict([('x', [x, x]), ('y', x)])
Я немного покопался и увидел, что в конце концов, tf.convert_to_tensor_or_sparse_tensor
вызывается в списке ввода (в __init__
за _KerasModel
), и это возвращает один тензор формы (2,20) вместо двух отдельных массивов или тензоров. Есть ли какой-то другой способ представить список входных данных, чтобы избежать этой проблемы?
1 ответ
Команда TFF просто выдвинула коммит, который должен содержать это исправление; этот коммит должен быть тем, что вы хотите. Смотрите, в частности, изменения в tensorflow_federated/python/learning/model_utils_test.py
- добавленный тестовый пример должен был быть повторением вашей проблемы, и теперь он проходит.
Вы были правы, чтобы позвонить нам tf.convert_to_tensor_or_sparse_tensor
; теперь мы используем tf.nest.map_structure
чтобы сопоставить этот вызов функции с листьями переданной структуры данных. Обратите внимание, что Keras также выполняет некоторую дополнительную нормализацию ввода; мы решили не дублировать эту логику здесь.
Это изменение не будет в пакете pip до следующего выпуска, но если вы соберете его из исходного кода, оно будет доступно уже сейчас.
Спасибо за этот улов и указывающий на правильное место!