web-dev-qa-db-ja.com

Tensorflowの複数のtf.data.Datasetsからランダムにサンプリングします

[〜#〜] n [〜#〜] tf.data.Datasetsと[〜#〜] n [〜#〜]確率のリストがあるとします( 1)に要約すると、ここで、例が指定された確率で[〜#〜] n [〜#〜]データセットからサンプリングされるようにデータセットを作成したいと思います。

これを任意の確率で機能させたい->各データセットからの例の数が固定された単純なZip/concat/flatmapは、おそらく私が探しているものではありません。

TFでこれを行うことは可能ですか?ありがとう!

9
serycjon

1.12の時点で、tf.data.experimental.sample_from_datasetsはこの機能を提供します: https://www.tensorflow.org/api_docs/python/tf/data/experimental/sample_from_datasets

編集:以前のバージョンでは、これはtf.contrib.data.sample_from_datasetsからアクセスできるようです

6
gkanwar

pが確率(または正規化されていない相対確率)のTensorであり、p[i]がデータセットiが選択される確率である場合、tf.multinomialtf.contrib.data.choose_from_datasetsと組み合わせて使用​​できます。

# 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)

データセットを初期化する必要があることに注意してください(単純なmake_one_shot_iteratorは使用できません)。

choice_iterator = combined_dataset.make_initializable_iterator()
choice = choice_iterator.get_next()
with tf.Session() as sess:
  sess.run(choice_iterator.initializer)
  print ''.join([sess.run(choice)[0] for _ in range(20)])

>> ddbcccdcccbbddadcadb
3
eriophora

使えると思います tf.contrib.data.rejection_resample 目標分布を達成するため。

2
dm0_