我不确定是否可以使用tf.data.Dataset
进行以下操作,但请想象以下内容:
我想使用tf.data.Dataset
加载数据集A和B,但是我想随机组合(添加)来自A和B的样本。
基本上,这就是我想要的:
sample = A.random_sample() + B.random_sample()
问题是这是否可以在Tensorflow中完成。
A = tf.data.Dataset('/data/a/*')
B = tf.data.Dataset('/data/b/*')
final_dataset = # <-- random_a + random_b
答案 0 :(得分:1)
A
和B
提取的两个子集:使用tf.data.experimental.sample_from_datasets
非常容易NUM_A = 42
NUM_B = 24
A = ... #load and preprocess your A data as a tf.data.Dataset (shuffle too, if necessary)
B = ... #load and preprocess your B data as a tf.data.Dataset (shuffle too, if necessary)
final_dataset = tf.data.experimental.sample_from_datasets([A.take(NUM_A),B.take(NUM_B)] seed=42) # seed is for repeatability
使用shuffle
,“ zip”和map
也非常容易:
BUF_SIZE = 1000 # arbitrary number chosen just for this example
A = ... #load and preprocess your A data as a tf.data.Dataset
B = ... #load and preprocess your B data as a tf.data.Dataset
A = A.shuffle(BUF_SIZE, seed=42) # seeds for repeatability
B = B.shuffle(BUF_SIZE, seed=43)
final_dataset = tf.data.Dataset.zip([A,B]).map(lambda a,b: a+b)
# possibly add a .repeat() for multiple epochs
在这种情况下,A和B分别进行混洗是提供随机组合的原因。最后重复一次(加上shuffle_every_iteration
中shuffle()
的默认True值),以确保在每个新纪元时,您在final_dataset
中得到一个新的随机组合。
答案 1 :(得分:1)
您可以使用tf.data.Dataset.from_generator
函数,在其中可以在生成器函数中实现两个数据集之间的融合逻辑。
import tensorflow as tf
tf.enable_eager_execution()
A = [1, 2, 3, 4]
B = [5, 6, 7, 8]
db1 = tf.data.Dataset.from_tensor_slices(A).shuffle(len(A))
db2 = tf.data.Dataset.from_tensor_slices(B).shuffle(len(B))
def cross_db_generator():
for db1_example, db2_example in zip(db1, db2):
# print(db1_example.numpy(), db2_example.numpy())
yield db1_example + db2_example
cross_db = tf.data.Dataset.from_generator(cross_db_generator, output_types=(tf.uint8))
cross_db = cross_db.batch(2)
for sample in cross_db:
print((sample[0].numpy(), sample[1].numpy()))