Разница между НП.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. Шаг 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, посмотрите на следующий блок кода, который определяет простой график, который принимает 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.