как выбрать индекс случайным образом, но не max (tf.arg_max) в tensorflow

#python #tensorflow

#python #tensorflow

Вопрос:

Я могу использовать tf.arg_max для выбора максимального индекса в матрице, есть ли функция tensorflow для случайного выбора индекса в top n?

 test = np.array([
[1, 2, 3],
 [2, 3, 4], 
 [5, 4, 3], 
 [8, 7, 2]])
argmax0 = tf.arg_max(test, 0)
# argmax0 = [3, 3, 1]
  

Мне нужна функция для случайного выбора индекса в топ-2 для каждого массива.
например:
первый colmuns [1, 2, 5, 8], top2 — это [5, 8], просто выберите один из [5, 8] случайным образом.
итак, окончательный ответ может быть [3, 2, 0], [2, 2, 0], [3, 3, 1], [3, 2, 0] или больше.

Ответ №1:

Вы используете метод .argsort, а затем берете верхнее значение N из этого

 N = 3
a = [1, 3, 4, 5, 2]
top_N_indicies = a.argsort()[-N:][::-1]

# top_N_indicies = [3, 2, 1]
  

Комментарии:

1. как работать с массивом 2 dims?

2. вы хотите, чтобы top-N для каждой строки 2-кратного массива?

Ответ №2:

Получить значения topk:

 values, _ = tf.math.top_k(test, 2)
  
 <tf.Tensor: shape=(4, 2), dtype=int32, numpy=
array([[3, 2],
       [4, 3],
       [5, 4],
       [8, 7]])>
  

Перетасуйте значения в каждой строке:

 shuffled = tf.map_fn(tf.random.shuffle, values)
  
 <tf.Tensor: shape=(4, 2), dtype=int32, numpy=
array([[2, 3],
       [4, 3],
       [4, 5],
       [7, 8]])>
  

Выберите первую строку каждой перетасованной строки:

 tf.gather(shuffled, [0], axis=1)
  
 <tf.Tensor: shape=(4, 1), dtype=int32, numpy=
array([[2],
       [4],
       [4],
       [7]])>
  

Копировать / вставлять код:

 import tensorflow as tf
import numpy as np

test = np.array([
    [1, 2, 3],
    [2, 3, 4],
    [5, 4, 3],
    [8, 7, 2]])

values, _ = tf.math.top_k(test, 2)

shuffled = tf.map_fn(tf.random.shuffle, values)

tf.gather(shuffled, [0], axis=1)