从Tensorflow中的多个tf.data.Datasets中随机抽样

时间:2018-04-10 09:10:26

标签: python tensorflow tensorflow-datasets

假设我有 N tf.data.Datasets和 N 概率列表(总和为1),现在我想创建数据集,以便示例为从具有给定概率的 N 数据集中采样。

我希望这适用于任意概率 - >简单的zip / concat / flatmap以及每个数据集中固定数量的示例可能不是我想要的。

有可能在TF中这样做吗?谢谢!

3 个答案:

答案 0 :(得分:4)

从1.12版本开始,modify_url提供了以下功能: https://www.tensorflow.org/api_docs/python/tf/data/experimental/sample_from_datasets

编辑:看起来在早期版本中,tf.data.experimental.sample_from_datasets

可以访问

答案 1 :(得分:2)

我认为您可以使用tf.contrib.data.rejection_resample来实现目标分发。

答案 2 :(得分:2)

如果p是概率的Tensor(或未归一化的相对概率),其中p[i]是选择数据集i的概率,则可以使用{{1} }与tf.multinomial结合使用:

tf.contrib.data.choose_from_datasets

请注意,数据集需要初始化(您不能使用简单的make_one_shot_iterator):

# create some datasets and their unnormalized probability of being chosen
datasets = [
    tf.data.Dataset.from_tensors(['a']).repeat(),
    tf.data.Dataset.from_tensors(['b']).repeat(),
    tf.data.Dataset.from_tensors(['c']).repeat(),
    tf.data.Dataset.from_tensors(['d']).repeat()]
p = [1., 2., 3., 4.]  # unnormalized

# random choice function
def get_random_choice(p):
  choice = tf.multinomial(tf.log([p]), 1)
  return tf.cast(tf.squeeze(choice), tf.int64)

# assemble the "choosing" dataset
choice_dataset = tf.data.Dataset.from_tensors([0])  # create a dummy dataset
choice_dataset = choice_dataset.map(lambda x: get_random_choice(p))  # populate it with random choices
choice_dataset = choice_dataset.repeat()  # repeat

# obtain your combined dataset, assembled randomly from source datasets
# with the desired selection frequencies. 
combined_dataset = tf.contrib.data.choose_from_datasets(datasets, choice_dataset)