Подтвердить что ты не робот

В чем разница между np.mean и tf.reduce_mean?

В учебнике для начинающих MNIST есть утверждение

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

tf.cast основном меняет тип тензора, которым является объект, но в чем разница между tf.reduce_mean и np.mean?

Вот документация по tf.reduce_mean:

reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)

input_tensor: тензор, чтобы уменьшить. Должен иметь числовой тип.

reduction_indices: размеры, чтобы уменьшить. Если None (по умолчанию), уменьшает все размеры.

# 'x' is [[1., 1. ]]
#         [2., 2.]]
tf.reduce_mean(x) ==> 1.5
tf.reduce_mean(x, 0) ==> [1.5, 1.5]
tf.reduce_mean(x, 1) ==> [1.,  2.]

Для одномерного вектора это выглядит как np.mean == tf.reduce_mean, но я не понимаю, что происходит в tf.reduce_mean(x, 1) ==> [1., 2.]. tf.reduce_mean(x, 0) ==> [1.5, 1.5] имеет смысл, поскольку средние значения [1,2] и [1,2] равны [1,5,1.5], но что происходит с tf.reduce_mean(x,1)

4b9b3361

Ответ 1

Функциональные возможности numpy.mean и tensorflow.reduce_mean одинаковы. Они делают то же самое. Из документации для numpy и tenorflow вы можете это увидеть. Давайте посмотрим на пример,

c = np.array([[3.,4], [5.,6], [6.,7]])
print(np.mean(c,1))

Mean = tf.reduce_mean(c,1)
with tf.Session() as sess:
    result = sess.run(Mean)
    print(result)

Выход

[ 3.5  5.5  6.5]
[ 3.5  5.5  6.5]

Здесь вы можете видеть, что когда axis (numpy) или reduction_indices (tenensflow) равен 1, он вычисляет среднее значение по (3,4) и (5,6) и (6,7), поэтому 1 определяет, по какой оси вычисляется среднее значение, Когда оно равно 0, среднее значение вычисляется по (3,5,6) и (4,6,7) и т.д. Я надеюсь, вы поняли идею.

Каковы различия между ними?

Вы можете вычислить NumPy операцию в любом месте на Python. Но для того, чтобы выполнить операцию с тензорным потоком, она должна быть выполнена внутри Session с тензорным потоком. Вы можете прочитать больше об этом здесь. Поэтому, когда вам нужно выполнить какое-либо вычисление для вашего графа тензорного потока (или структуры, если хотите), это должно быть сделано внутри Session тензорного потока.

Давайте посмотрим на другой пример.

npMean = np.mean(c)
print(npMean+1)

tfMean = tf.reduce_mean(c)
Add = tfMean + 1
with tf.Session() as sess:
    result = sess.run(Add)
    print(result)

Мы могли бы увеличить среднее значение на 1 в numpy как вы, естественно, но для того, чтобы сделать это в тензорном потоке, вам нужно выполнить это в Session, без использования Session вы не сможете этого сделать. Другими словами, когда вы вычисляете tfMean = tf.reduce_mean(c), тензор потока не вычисляет его тогда. Это только вычисляет это в Session. Но numpy вычисляет это мгновенно, когда вы пишете np.mean().

Я надеюсь, что это имеет смысл.

Ответ 2

Ключевым моментом здесь является слово Reduce, концепция функционального программирования, которая дает возможность Redu_mean в TensorFlow сохранять скользящее среднее значение результатов вычислений из пакета входных данных.

Если вы не знакомы с функциональным программированием, это может показаться загадочным. Итак, сначала давайте посмотрим, что делает сокращение. Если вам дали список типа [1,2,5,4] и сказали вычислить среднее, это просто - просто передайте весь массив в np.mean, и вы получите среднее. Однако что, если вам нужно вычислить среднее значение потока чисел? В этом случае вам придется сначала собрать массив, прочитав из потока, а затем вызвать np.mean для полученного массива - вам придется написать еще немного кода.

Альтернативой является использование парадигмы сокращения. В качестве примера рассмотрим, как мы можем использовать Reduce в Python для вычисления суммы чисел: reduce(lambda x,y: x+y, [1,2,5,4]).

Это работает так:

  1. Шаг 1: прочитать 2 цифры из списка - 1,2. Оценить лямбда 1,2. Снижение сохраняет результат 3. Примечание - это единственный шаг, где 2 цифры считываются из списка
  2. Шаг 2: Прочитайте следующую цифру из списка - 5. Оцените лямбду 5, 3 (3 - результат шага 1, который уменьшает хранимую информацию). уменьшить магазины результат 8.
  3. Шаг 3: Прочитайте следующую цифру из списка - 4. Оцените лямбду 8,4 (8 - результат шага 2, который уменьшает хранимую информацию). уменьшить магазины результат 12
  4. Шаг 4: Считайте следующую цифру из списка - их нет, поэтому верните сохраненный результат 12.

Подробнее читайте здесь Функциональное программирование на Python

Чтобы увидеть, как это применимо к TensorFlow, посмотрите на следующий блок кода, который определяет простой граф, который принимает число с плавающей запятой и вычисляет среднее значение. Входные данные для графика, однако, представляют собой не один тип с плавающей точкой, а массив с плавающей точкой. Reduce_mean вычисляет среднее значение по всем этим числам.

import tensorflow as tf


inp = tf.placeholder(tf.float32)
mean = tf.reduce_mean(inp)

x = [1,2,3,4,5]

with tf.Session() as sess:
    print(mean.eval(feed_dict={inp : x}))

Этот шаблон полезен при вычислении значений по пакетам изображений. Посмотрите на Пример Deep MNIST, где вы видите такой код:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

Ответ 3

В новой документации указано, что tf.reduce_mean() дает те же результаты, что и np.mean:

Эквивалентен np.mean

Он также имеет абсолютно такие же параметры, как np.mean. Но вот важная разница: они дают одни и те же результаты только по значениям float:

import tensorflow as tf
import numpy as np
from random import randint

num_dims = 10
rand_dim = randint(0, num_dims - 1)
c = np.random.randint(50, size=tuple([5] * num_dims)).astype(float)

with tf.Session() as sess:
    r1 = sess.run(tf.reduce_mean(c, rand_dim))
    r2 = np.mean(c, rand_dim)
    is_equal = np.array_equal(r1, r2)
    print is_equal
    if not is_equal:
        print r1
        print r2

Если вы удалите преобразование типов, вы увидите разные результаты


В дополнение к этому многие другие функции tf.reduce_, такие как reduce_all, reduce_any, reduce_min, reduce_max, reduce_prod производят те же значения, что и numpy-аналоги. Очевидно, что они являются операциями, они могут выполняться только изнутри сеанса.

Ответ 4

1 обычно относится к строкам, а 2 обычно относится к столбцам. Уменьшение индекса "over" 1 означает уменьшение количества ролей.

[1., 2.] - это просто [ <row 1 mean> , <row 2 mean> ].

Это правило нумерации индексов типично для программного обеспечения статистики, особенно для R.