Адаптация существующей модели 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 до следующего выпуска, но если вы соберете его из исходного кода, оно будет доступно уже сейчас.

Спасибо за этот улов и указывающий на правильное место!

Другие вопросы по тегам