Tensorflow создайте новый тензор из тензора и маски

#python #tensorflow

Вопрос:

Проблема в том, что:

У меня есть тензор, на этом тензоре я нахожу элементы k_top, я создаю маску с 0, если элемент не k_top, и 1 в противном случае, затем я умножаю исходный тензор на маску, создавая tensor_masked. После этого я вычисляю среднее значение тензора.

Проблема теперь в том, что я хочу вернуть новый тензор, в котором только элементы k_top равны среднему значению (-среднее, если исходное значение внутри начального тензора было отрицательным, среднее в противном случае).

Как я могу это сделать?

Это код на данный момент:

 def stc_compression(tensor, sparsification_rate):  mask = tf.cast(tf.abs(tensor) gt;= tf.math.top_k(tf.abs(tensor), sparsification_rate)[0][-1], tf.float32)  tensor_masked = tf.multiply(tensor, mask)  average = tf.reduce_mean(tf.abs(tensor_masked)) / sparsification_rate  return compressed_tensor  

После этого есть ли возможный способ оптимизировать этот процесс?

Ответ №1:

Если вы хотите вычислить среднее значение абсолютных значений tensor_masked, используйте

 tf.reduce_mean(tf.abs(tensor_masked))  

если вы хотите вычислить среднее абсолютное значение верхних значений k, вам следует использовать

 tf.reduce_sum(tf.abs(tensor_masked)) / sparsification_rate  

Затем, чтобы получить замаскированные значения с правильным знаком, вы можете использовать операцию tf.sign и использовать другую маску для замены замаскированных значений

 def stc_compression(tensor, sparsification_rate):  mask = tf.cast(tf.abs(tensor) gt;= tf.math.top_k(tf.abs(tensor), sparsification_rate)[0][-1], tf.float32)  inv_mask = tf.cast(tf.abs(tensor) lt; tf.math.top_k(tf.abs(tensor), sparsification_rate)[0][-1], tf.float32)  tensor_masked = tf.multiply(tensor, mask)  average = tf.reduce_sum(tf.abs(tensor_masked)) / sparsification_rate  compressed_tensor = tf.add( tf.multiply(average, mask) * tf.sign(tensor), tf.multiply(tensor, inv_mask))  return compressed_tensor  

Скажите мне, если я неправильно понял вашу проблему.

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

1. Все правильно, я просто перешел compressed_tensor = tf.add( tf.multiply(average, mask) * tf.sign(tensor), tf.multiply(tensor, inv_mask)) на compressed_tensor = tf.add( tf.multiply(average, mask) * tf.sign(tensor), tf.multiply(tensor_masked, inv_mask)) , так как хотел все 0, кроме значений top_k, но работает идеально!