Случайный выбор numpy в Tensorflow

Есть ли эквивалентная функция для случайного выбора numpy в Tensorflow. В numpy мы можем получить элемент случайным образом из данного списка с его весами.

 np.random.choice([1,2,3,5], 1, p=[0.1, 0, 0.3, 0.6, 0])

Этот код выберет элемент из данного списка с весами p.

Ответ 1

Нет, но вы можете достичь того же результата, используя tf.multinomial:

elems = tf.convert_to_tensor([1,2,3,5])
samples = tf.multinomial(tf.log([[1, 0, 0.3, 0.6]]), 1) # note log-prob
elems[tf.cast(samples[0][0], tf.int32)].eval()
Out: 1
elems[tf.cast(samples[0][0], tf.int32)].eval()
Out: 5

Часть [0][0] находится здесь, так как multinomial ожидает ряд ненормализованных логарифмических вероятностей для каждого элемента пакета, а также имеет другое измерение для числа выборок.

Ответ 2

Если вместо выборки случайных элементов из 1-мерного тензора вы хотите случайной выборкой строк из n-мерного тензора, вы можете объединить tf.multinomial и tf.gather.

def _random_choice(inputs, n_samples):
    """
    With replacement.
    Params:
      inputs (Tensor): Shape [n_states, n_features]
      n_samples (int): The number of random samples to take.
    Returns:
      sampled_inputs (Tensor): Shape [n_samples, n_features]
    """
    # (1, n_states) since multinomial requires 2D logits.
    uniform_log_prob = tf.expand_dims(tf.zeros(tf.shape(inputs)[0]), 0)

    ind = tf.multinomial(uniform_log_prob, n_samples)
    ind = tf.squeeze(ind, 0, name="random_choice_ind")  # (n_samples,)

    return tf.gather(inputs, ind, name="random_choice")