Python 如何使用tf.data.Dataset.map对两个tf.data.Dataset进行元素式求和,这两个集合都是无限期迭代的?

Python 如何使用tf.data.Dataset.map对两个tf.data.Dataset进行元素式求和,这两个集合都是无限期迭代的?,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我想在基于tf.data的管道中编写一个混合数据增强[1]函数 我用我的培训示例生成了一个tf.data.Dataset,另一个生成了我想用来扩充培训示例的示例 我想将数据集的元素feat\u train,label\u train映射到feat\u train+feat\u aug,label\u train,label\u aug,feat\u aug和label\u aug作为数据集的元素,这样两个数据集都可以无限期地迭代,例如,对于包含3个元素的数据集和包含2个元素的数据集: 专长训练[

我想在基于tf.data的管道中编写一个混合数据增强[1]函数

我用我的培训示例生成了一个tf.data.Dataset,另一个生成了我想用来扩充培训示例的示例

我想将数据集的元素feat\u train,label\u train映射到feat\u train+feat\u aug,label\u train,label\u aug,feat\u aug和label\u aug作为数据集的元素,这样两个数据集都可以无限期地迭代,例如,对于包含3个元素的数据集和包含2个元素的数据集:

专长训练[0],标签训练[0]->专长训练[0]+专长训练[0],标签训练[0]+标签训练[0]
壮举训练[1],标签训练[1]->壮举训练[1]+壮举训练[1],标签训练[1]+标签训练[1]
壮举训练[2],标签训练[2]->壮举训练[2]+壮举训练[0],标签训练[2]+标签训练[0]
专长训练[0],标签训练[0]->专长训练[0]+专长训练[1],标签训练[0]+标签训练[1]
专长训练[1],标签训练[1]->专长训练[1]+专长训练[0],标签训练[1]+标签训练[0]

我怎样才能在我的混搭中得到这种行为?对于2tf.data.dataset无限迭代,是否有其他建议的方法来执行元素操作

[1] 张宏义,等。“混淆:超越经验风险最小化。”arXiv预印本arXiv:1710.09412(2017)

#文件(train)和文件(aug)是TFRecord文件的列表。
#解析TFRecords以获取培训示例功能和
#一个热编码标签
dataset\u train=tf.data.TFRecordDataset(文件\u train)
dataset\u train=dataset\u train.map(
lambda x:序列化数据(x,特征形状,类列表))
dataset\u train=dataset\u train.shuffle(10000)
dataset_train=dataset_train.repeat()#无限期重复。
#解析TFRecords以获取增强示例功能和
#一个热编码标签
dataset\u aug=tf.data.TFRecordDataset(文件\u aug)
dataset_aug=dataset_aug.map(
lambda x:序列化数据(x,特征形状,类列表))
dataset_aug=dataset_aug.repeat()#无限期重复。
#增强数据(混合)
#在这里,我如何编写一个映射函数,使每个项目的功能
#数据集\u列的项与数据集\u列的项混合?
#差不多
#dataset\u train=dataset\u train.map(
#lambda壮举列车,标签列车:混搭(
#壮举列车,标签列车,壮举8月,标签8月)
# )
# ?
#但我如何迭代数据集以获得专长和标签?
#成批
dataset\u train=dataset\u train.batch(批次大小,下降量=真)
返回数据集
def合成(专长训练、标号训练、专长训练、标号训练):
#作为示例显示。这将更加复杂。。。
返回(壮举训练+壮举8月,
标签(列车+标签(8月)
def序列化数据(
序列化的_数据,
特征为U形,
班级名单,
数据\u格式='channels\u first',
培训=正确):
“”“生成功能、标签,如果培训为假,则生成文件名和时间。
标签是class_列表中原始标签的索引。
Args:
序列化的_数据:使用utils.tf_utils.serialize_数据序列化的数据
特征形状:特征的形状。可通过
feature\u提取器.feature\u形状(参见utils.feature\u utils)
class_list:类ID列表(用于标签的热编码)
数据格式:“频道优先”(NCHW)或“频道最后”(NHWC)。
默认设置为“通道\ U优先”,因为它在GPU上更快
(https://www.tensorflow.org/guide/performance/overview#data_formats).
"""
特征={
“文件名”:tf.io.FixedLenFeature([],tf.string),
“时间”:tf.io.FixedLenFeature([2],tf.float32),
“数据”:tf.io.FixedLenFeature(feature_shape,tf.float32),
“标签”:tf.io.FixedLenFeature([],tf.string),
}
example=tf.io.parse_single_示例(序列化的_数据、特性)
#将数据重塑为第一种格式
如果数据\u格式==‘通道\u优先’:
data=tf.重塑(例如['data'],(1,特征形状[0],特征形状[1]))
其他:
数据=tf.重塑(例如['data'],(特征形状[0],特征形状[1],1))
#一个热编码标签
标签=tf.strings.to_编号(
tf.string_split([示例['labels']],'#').value,
out_type=tf.int32
)
#获取类列表和标签的交集
标签=tf(
疏密(
交叉点(
tf.展开尺寸(标签,轴=0),
tf.展开尺寸(类列表,轴=0)
)
),
轴=0
)
#对class_列表进行排序并获取class_列表中标签的索引
class\u list=tf.sort(class\u list)
标签=tf.where(
tf.equal(
tf.展开尺寸(标签,轴=1),
类别(列表)
)[:,1]
秒(
tf.math.logical_和(training,tf.equal(tf.size(labels),0)),
true_fn=lambda:myprint(tf.strings.format('File{}没有标签',示例['filename']),
false_fn=λ:1
)
一热=tf.cond(
tf.相等(tf.大小(标签),0),
true_fn=lambda:tf.zero(tf.size(class_list)),
false\u fn=lambda:tf.reduce\u max(tf.one\u hot(标签,tf.size(类列表)),0)
)
如果培训:
返回(数据,一个热)
其他:
返回(数据,一次热处理,示例['filename'],示例['times']))

我将给出一个示例代码,说明如何实现您所要求的目标。我已经创建了长度分别为3和2的
train_数据集
aug_数据集
。两者都有图像和标签。图像具有形状(64、64、3)。
train
的标签为[10,20,30],而
aug
的标签为[1,2]

请特别注意标签输出,并查看它们是否按照您想要的方式重复

import numpy as np
import tensorflow as tf

tf.enable_eager_execution()

train_dataset = tf.data.Dataset.from_tensor_slices((np.random.rand(3, 64, 64, 3), 
                                                    np.array([10, 20, 30])))
aug_dataset = tf.data.Dataset.from_tensor_slices((np.random.rand(2, 64, 64, 3), 
                                                  np.arange(1, 3)))

train_dataset = train_dataset.repeat()
aug_dataset = aug_dataset.repeat()

dataset = tf.data.Dataset.zip((train_dataset, aug_dataset))

def add_datasets(dataset1, dataset2):
  image_data = dataset1[0] + dataset2[0]
  label_data = dataset1[1] + dataset2[1]
  return image_data, label_data

dataset = dataset.map(add_datasets)

for a, b in dataset:
  print(a.shape, b)
输出:

(64, 64, 3) tf.Tensor(11, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(22, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(31, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(12, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(21, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(32, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(11, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(22, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(31, shape=(), dtype=int64)
(64, 64, 3) tf.Tensor(12, shape=(), dtype=int64)

密钥是tf.data.Dataset.zip。谢谢