如何将两个字典 MapDataset 合并到一个 MapDataset?

How to merge two dict MapDataset to one MapDataset?

我在将多个 MapDataset 连接到一个 MapDataset 时遇到问题。例如,一个 MapDataset 是:

<MapDataset element_spec={'input_ids_task1': TensorSpec(), 'mask_task1': TensorSpec(), 'type_ids_task1': TensorSpec()}

另一个是:

<MapDataset element_spec={'input_ids_task2': TensorSpec(), 'mask_task2': TensorSpec(), 'type_ids_task2': TensorSpec()}

我想将它们连接到:

<MapDataset element_spec={'input_ids_task1': TensorSpec(), 'mask_task1': TensorSpec(), 'type_ids_task1': TensorSpec(), 'input_ids_task2': TensorSpec(), 'mask_task2': TensorSpec(), 'type_ids_task2': TensorSpec()}

我似乎找到了一些可以通过以下方式压缩两个数据集的答案:

h = tf.data.Dataset.zip((a, b))

那么 h 将是一个 ZipDataset:

<ZipDataset element_spec=({'input_ids_task1': TensorSpec(), 'mask_task1': TensorSpec(), 'type_ids_task1': TensorSpec()}, {'input_ids_task2': TensorSpec(), 'mask_task2': TensorSpec(), 'type_ids_task2': TensorSpec()})

因为这两个数据集将是一个元组中的两个字典。

我可以通过以下方式检索 MapDataset:

h.map(lambda x,y: x)

但是,我不确定如何将它们合并到一个字典中。

如果那不可能,我可以将我的输入层更改为包含多个字典的元组以获取数据集输入吗?

不确定您的数据到底是什么样子,但您应该可以这样做:

import tensorflow as tf

d1 = {
    'input_ids_task1': [[1, 2, 3], [1, 2, 2]],
    'mask_task1': [[1, 2, 3], [1, 2, 2]],
    'type_ids_task1': [[1, 2, 3], [1, 2, 2]] 
}

d2 = {
    'input_ids_task2': [[1, 2, 3], [1, 2, 2]],
    'mask_task2': [[1, 2, 3], [1, 2, 2]],
    'type_ids_task2': [[1, 2, 3], [1, 2, 2]] 
}

dataset1 = tf.data.Dataset.from_tensor_slices((d1))
dataset2 = tf.data.Dataset.from_tensor_slices((d2))

h = tf.data.Dataset.zip((dataset1, dataset2))
h = h.map(lambda x, y: {**x, **y})
print(h)

for d in h:
  print(d)
<MapDataset element_spec={'input_ids_task1': TensorSpec(shape=(3,), dtype=tf.int32, name=None), 'mask_task1': TensorSpec(shape=(3,), dtype=tf.int32, name=None), 'type_ids_task1': TensorSpec(shape=(3,), dtype=tf.int32, name=None), 'input_ids_task2': TensorSpec(shape=(3,), dtype=tf.int32, name=None), 'mask_task2': TensorSpec(shape=(3,), dtype=tf.int32, name=None), 'type_ids_task2': TensorSpec(shape=(3,), dtype=tf.int32, name=None)}>
{'input_ids_task1': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>, 'mask_task1': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>, 'type_ids_task1': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>, 'input_ids_task2': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>, 'mask_task2': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>, 'type_ids_task2': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 3], dtype=int32)>}
{'input_ids_task1': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 2], dtype=int32)>, 'mask_task1': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 2], dtype=int32)>, 'type_ids_task1': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 2], dtype=int32)>, 'input_ids_task2': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 2], dtype=int32)>, 'mask_task2': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 2], dtype=int32)>, 'type_ids_task2': <tf.Tensor: shape=(3,), dtype=int32, numpy=array([1, 2, 2], dtype=int32)>}