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