Как работает функция 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.

Сравнение с :

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 в качестве выхода.