1

我正在尝试将联合学习应用于需要两个输入的现有 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__for 中_KerasModel),它返回一个形状为 (2,20) 的张量,而不是两个单独的数组或张量。是否有其他方法可以表示输入列表以避免此问题?

4

1 回答 1

1

TFF 团队刚刚推送了一个应该包含此错误修复的提交;这个提交应该是你想要的。请特别查看tensorflow_federated/python/learning/model_utils_test.py--the added test case 中的更改应该是您的问题的重现,现在它通过了。

你呼唤我们的呼唤是对的tf.convert_to_tensor_or_sparse_tensor;现在我们使用tf.nest.map_structure将此函数调用映射到传入数据结构的叶子。请注意,Keras 还进行了一些额外的输入标准化;我们决定不在这里重复这个逻辑。

在下一个版本之前,此更改不会出现在 pip 包中,但如果您从源代码构建,它现在将可用。

感谢您的捕获,并指向正确的位置!

于 2019-05-15T17:05:49.570 回答