Tensorflow, как реализовать уровень сортировки

#tensorflow #keras #deep-learning #neural-network #keras-layer

#tensorflow #keras #глубокое обучение #нейронная сеть #keras-layer

Вопрос:

Я пытаюсь создать слой в keras, который принимает плоский тензор x (не имеет нулевого значения в нем и shape = (batch_size, единицы измерения)), умноженный на a mask (той же формы), и он будет сортировать его таким образом, чтобы замаскированные значения были помещены первыми в вывод (порядок значений элементов не имеет значения). Для наглядности вот пример (batch_size = 1, units = 8):

введите описание изображения здесь

Это кажется простым, но проблема в том, что я не могу найти хорошее решение. Приветствуется любой код или идея.

Ответ №1:

Мой текущий код выглядит следующим образом, если вы знаете более эффективный способ, пожалуйста, дайте мне знать.

 class Sort(keras.layers.Layer):
  
  def call(self, inputs):
    x = inputs.numpy()
    nonx, nony = x.nonzero()    # idxs of nonzero elements
    zero = [np.where(x == 0)[0][0], np.where(x == 0)[1][0]]   # idx of first zero
    x_shape = tf.shape(inputs)
    result = np.zeros((x_shape[0], x_shape[1], 2), dtype = 'int')   # mapping matrix

    result[:, :, 0]  = zero[0]
    result[:, :, 1]  = zero[1]
    p = np.zeros((x_shape[0]), dtype = 'int')
    for i, j in zip(nonx, nony):
      result[i, p[i]] = [i, j]
      p[i]  = 1

    y = tf.gather_nd(inputs, result)
    return y