Как работает функция reduce_sum() в тензорном потоке?
Я изучаю shadoworflow, я взял следующий код с веб-сайта tensorflow. По моему мнению, ось = 0 для строк, а ось = 1 для столбцов.
Как они выводятся в комментариях? Я упомянул выход в соответствии с моим соображением против ##.
import tensorflow as tf
x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf.reduce_sum(x, 0) # [2, 2, 2] ## [3, 3]
tf.reduce_sum(x, 1) # [3, 3] ##[2, 2, 2]
tf.reduce_sum(x, [0, 1]) # 6 ## Didn't understood at all.
Ответы
Ответ 1
x
имеет форму (2, 3)
(две строки и три столбца):
1 1 1
1 1 1
Выполняя tf.reduce_sum(x, 0)
тензор уменьшается вдоль первой размерности (строк), поэтому результат [1, 1, 1] + [1, 1, 1] = [2, 2, 2]
.
Выполняя tf.reduce_sum(x, 1)
тензор уменьшается по второму размеру (столбцам), поэтому результат [1, 1] + [1, 1] + [1, 1] = [3, 3]
.
Выполняя tf.reduce_sum(x, [0, 1])
тензор уменьшается вдоль BOTH размеров (строк и столбцов), поэтому результат равен 1 + 1 + 1 + 1 + 1 + 1 = 6
или, что эквивалентно [1, 1, 1] + [1, 1, 1] = [2, 2, 2]
, а затем 2 + 2 + 2 = 6
(уменьшите вдоль строк, затем уменьшите полученный массив).
Ответ 2
Вход представляет собой двухмерный тензор:
1 1 1
1 1 1
Ось 0 в тензорном потоке - это строки, 1 - столбцы. Сумма вдоль оси 0 будет давать одномерный тензор длины 3
, каждый элемент представляет собой сумму за столбец. Таким образом, результат [2, 2, 2]
. Аналогично для строк.
Сумма вдоль обеих осей представляет собой в этом случае сумму всех значений в тензоре, равную 6
.
Сравнение с numpy:
a = np.array([[1, 1, 1], [1, 1, 1]])
np.sum(a, axis=0) # [2 2 2]
np.sum(a, axis=1) # [3 3]
np.sum(a, axis=(0, 1)) # 6
Как вы можете видеть, вывод одинаков.
Ответ 3
Чтобы лучше понять, что происходит, я изменю значения, и результаты будут самоочевидными
import tensorflow as tf
x = tf.constant([[1, 2, 4], [8, 16, 32]])
a = tf.reduce_sum(x, 0) # [ 9 18 36]
b = tf.reduce_sum(x, 1) # [ 7 56]
c = tf.reduce_sum(x, [0, 1]) # 63
with tf.Session() as sess:
output_a = sess.run(a)
print(output_a)
output_b = sess.run(b)
print(output_b)
output_c = sess.run(c)
print(output_c)
Ответ 4
Думайте так, ось указывает размер, который будет исключен. Таким образом, для первой оси случая 0
, поэтому, если вы пройдете через это измерение (2 записи), все они свернуты в 1. Таким образом, это будет выглядеть следующим образом:
result = [[1,1,1] + [1,1,1]] = [2,2,2]
Итак, вы удалили измерение 0
.
Теперь для второго случая вы свернете ось 1
(или столбцы), поэтому:
result = [[1,1] + [1,1] + [1,1]] = [2,2]
И последний случай - вы продолжаете рушиться в порядке, указанном в скобках. Другими словами, сначала вы удаляете строки, а затем столбцы:
result1 = [2,2,2]
result_final = 2 + 2 + 2 = 6
Надеюсь, это поможет!
Ответ 5
tf.reduce_sum(x, [0, 1])
команды сначала вычисляют сумму по оси = 0 (по строкам), а затем вычисляют сумму по оси = 1 (по столбцам)
Например,
x = tf.constant([[1, 1, 1], [1, 1, 1]])
Вы суммируете в [2,2,2] после вычисления суммы по оси = 0.
Вы суммируете 2 + 2 + 2 после вычисления суммы по оси = 1.
Наконец, получая 6 в качестве выхода.