Разница между НП.mean и tf.уменьшить среднее значение в Numpy и Tensorflow?
на учебник для начинающих 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: The tensor to reduce. Should have numeric type.
reduction_indices: The dimensions to reduce. If `None` (the defaut),
reduces all dimensions.
# '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.]
для вектора 1D он выглядит как 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)
?
4 ответов
функциональные возможности numpy.mean
и tensorflow.reduce_mean
то же самое. Они делают то же самое. Из документации, для включает в себя и tensorflow, вы можете увидеть, что. Давайте рассмотрим пример,
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
(tensorflow) равно 1, он вычисляет среднее значение через (3,4) и (5,6) и (6,7), поэтому 1
определяет, по какой оси вычисляется среднее значение. Когда это 0, среднее значение вычисленные по(3,5,6) и (4,6,7), и так далее. Надеюсь, вы поняли.
теперь каковы различия между ними?
вы можете вычислить операцию numpy в любом месте на python. Но для того, чтобы сделать операцию tensorflow, это должно быть сделано внутри tensorflow Session
. Вы можете прочитать больше об этом здесь. Поэтому, когда вам нужно выполнить любое вычисление для вашего графика tensorflow (или структуры, если хотите), это должно быть сделано внутри tensorflow 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
как вы, естественно, но для того, чтобы сделать это в tensorflow, вам нужно выполнить это в Session
, без использования Session
вы не можете этого сделать. Другими словами, когда вы вычисляете tfMean = tf.reduce_mean(c)
, tensorflow не вычисляет его тогда. Он вычисляет это только в Session
. Но numpy вычисляет это мгновенно, когда вы пишете np.mean()
.
я надеюсь, что это делает чувство.
ключевым здесь является слово reduce, концепция функционального программирования, которая позволяет reduce_mean в TensorFlow сохранять среднее значение результатов вычислений из пакета входных данных.
Если вы не знакомы с функциональным программированием, это может показаться загадочным. Итак, сначала давайте посмотрим, что делает reduce. Если вам дали список вроде [1,2,5,4] и сказали вычислить среднее, это легко - просто передайте весь массив в np.злой, и ты получаешь ... означать. Однако что, если вам нужно было вычислить среднее значение потока чисел? В этом случае вам придется сначала собрать массив, прочитав из потока, а затем вызвать np.значит, на результирующем массиве-вам придется написать еще какой-то код.
альтернативой является использование парадигмы сокращения. В качестве примера рассмотрим, как мы можем использовать 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, посмотрите на следующий блок кода, который определяет простой график, который принимает float и вычисляет среднее значение. Однако вход в график-это не один поплавок, а массив поплавков. 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}))
этот шаблон пригодится при вычислении значений по пакетам изображений. Посмотреть глубокий пример MNIST где вы видите следующий код:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
в новой документации указано, что tf.reduce_mean()
дает те же результаты, что и np.имею в виду:
эквивалент np.имею в виду
он также имеет абсолютно те же параметры, что и np.имею в виду. Но вот важное отличие: они дают одни и те же результаты только для значений 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
если вы удалите преобразование типов, вы увидите разные результаты
In в дополнение к этому, многие другие tf.reduce_
функции, такие как reduce_all
, reduce_any
, reduce_min
, reduce_max
, reduce_prod
производят те же значения, что и аналоги numpy. Очевидно, поскольку они являются операциями, они могут выполняться только изнутри сеанса.
1
обычно относится к строкам, и 2
обычно относится к столбцам. Уменьшение индекса" over"1
значит уменьшить rowwise.
[1., 2.]
- это просто [ <row 1 mean> , <row 2 mean> ]
.
это соглашение о нумерации индексов типично для программного обеспечения статистики, особенно R.