TensorFlow Federated:如何为具有多个输入的模型编写输入规范

TensorFlow Federated: How can I write an Input Spec for a model with more than one input

我正在尝试使用 tensorflow 提供的联邦学习库制作图像字幕模型,但我遇到了这个错误

Input 0 of layer dense is incompatible with the layer: : expected min_ndim=2, found ndim=1.

这是我的input_spec:

input_spec=collections.OrderedDict(x=(tf.TensorSpec(shape=(2048,), dtype=tf.float32), tf.TensorSpec(shape=(34,), dtype=tf.int32)), y=tf.TensorSpec(shape=(None), dtype=tf.int32))

该模型将图像特征作为第一个输入,将词汇列表作为第二个输入,但我无法在 input_spec 变量中表达这一点。我尝试将其表示为列表列表,但它仍然不起作用。接下来我可以尝试什么?

好问题!在我看来,这个错误是由 TensorFlow 本身引起的——表明您可能具有正确的嵌套结构,但叶子可能会脱落。从 TFF 的角度来看,您的输入规范看起来像 "should work",因此它似乎可能与您拥有的数据略有不匹配

我要尝试的第一件事——如果您有一个示例 tf.data.Dataset 将传递给您的客户端计算,您可以直接 直接阅读 input_spec数据集作为 element_spec 属性 。这看起来像:

# ds = example dataset
input_spec = ds.element_spec

这是最简单的路径。如果您有类似 "lists of lists of numpy arrays" 的内容,您仍然可以通过一种方法从数据本身中提取此信息——以下代码片段应该可以帮助您:

# data = list of list of numpy arrays
input_spec = tf.nest.map_structure(lambda x: tf.TensorSpec(x.shape, x.dtype), data)

最后,如果你有tf.Tensors的列表列表,TensorFlow提供了类似的功能:

# tensor_structure = list of lists of tensors
tf.nest.map_structure(tf.TensorSpec.from_tensor, tensor_structure)

简而言之,我建议 而不是 手动指定 input_spec,而是让数据告诉您它的输入规范应该是什么。