使具有多个输入的现有keras模型适应联邦的tensorflow

时间:2019-05-12 01:45:33

标签: tensorflow keras tensorflow-federated

我正在尝试将联合学习应用于需要两个输入的现有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>]

该模型接受两个numpy数组作为输入,因此我将我的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__的{​​{1}}中),并且返回单个形状的张量( 2,20),而不是两个单独的数组或张量。为了避免这个问题,还有其他方法可以代表输入列表吗?

1 个答案:

答案 0 :(得分:1)

TFF团队刚刚推送了一个包含此错误修正的提交; this commit应该是您想要的。特别要注意tensorflow_federated/python/learning/model_utils_test.py中的更改-添加的测试用例应该是您问题的再现,并且现在可以通过。

您正确地打出我们对tf.convert_to_tensor_or_sparse_tensor的电话;现在我们使用tf.nest.map_structure将此函数调用映射到传入的数据结构的叶子。请注意,Keras还进行了一些额外的输入归一化。我们决定在这里不重复这种逻辑。

在下一个版本发布之前,不会在pip软件包中包含此更改,但是如果从源代码构建,则现在可以使用。

感谢您的收获,并指向正确的地方!