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