Как выполнить reduce_op для нескольких измерений одновременно?

Допустим, у меня есть список тензоров ранга N, выраженный как тензор ранга N+1. Например, список из 100 матриц 10x20 в виде тензора ранга 3 формы (100,10,20). Мне нужно выполнить одни и те же операции над каждой из этих матриц: суммировать все элементы, среднее и медиану значений i-й матрицы для каждой матрицы. Можно ли сделать что-то вроде tf.math.reduce_sum, tf.math.reduce_mean, tf.contrib.distributions.percentile, по оси 0, но вычислив сразу всю матрицу для каждого элемента по оси 0?

НАПРИМЕР.:

matricesList = tf.constant([[[1,1],[1,1]],
                           [[2,2],[2,2]]])

op = sum_matrices_along_axis(matrixList)

С ожидаемым op = [4,8]

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
657
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете передать несколько измерений в параметр операций сокращения axis:

import tensorflow as tf

matricesList = tf.constant([[[1, 1], [1, 1]],
                            [[2, 2], [2, 2]]])
matricesSum = tf.reduce_sum(matricesList, axis=[1, 2])
with tf.Session() as sess:
    print(sess.run(matricesSum))
    # [4 8]

Даже если вы заранее не знаете количество измерений, вы все равно можете уменьшить «все, кроме первого» измерения:

import tensorflow as tf

# The number of dimensions of tensorsList is unspecified
tensorsList = tf.placeholder(tf.int32)
# Dimensions from one to the last one
reduceDims = tf.range(1, tf.rank(tensorsList))
tensorsSum = tf.reduce_sum(tensorsList, axis=reduceDims)
with tf.Session() as sess:
    matrices = [[[1, 1], [1, 1]],
                [[2, 2], [2, 2]]]
    print(sess.run(tensorsSum, feed_dict = {tensorsList: matrices}))
    # [4 8]

Большое спасибо, я не знал, что можно передать несколько осей, но, прежде всего, я полностью упустил из виду, что могу просто сгладить элементы рангового тензора N + 1 в массиве и вычислить все операции над матрицей сглаженные тензоры, так как я не возражаю против их размерности.

LolAsdOmgWtfAfk 22.01.2019 15:44

@LolAsdOmgWtfAfk Да, верно, вы также можете сделать tf.reduce_sum(tf.reshape(tensorsList, [tf.shape(tensorsList)[0], -1]), axis=1).

jdehesa 22.01.2019 15:52

Извините, тензор ранга N* Попробую самый быстрый вариант, спасибо :)

LolAsdOmgWtfAfk 22.01.2019 16:07

Другие вопросы по теме