#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, но работает идеально!