Разница между НП.значит и ТФ.уменьшить среднее значение в Numpy и Tensorflow?
на MNIST beginner tutorial, есть 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(тензорный поток) равен 1, он вычисляет среднее значение по (3,4) и (5,6) и (6,7), поэтому1определяет, по какой оси вычисляется среднее значение. Когда он равен 0, то есть вычисленные по(3,5,6) и (4,6,7), и так далее. Я надеюсь, что вы поняли идею.так в чем же разница между ними?
вы можете вычислить операцию numpy в любом месте на python. Но для того, чтобы сделать операцию tensorflow, это должно быть сделано внутри tensorflow
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как вы бы естественно, но для того, чтобы сделать это в 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, посмотрите на следующий блок кода, который определяет простой график, который принимает поплавок и вычисляет среднее значение. Однако вход в график-это не один поплавок, а массив поплавков. 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.имею в виду. Но вот важное отличие: они дают одинаковые результаты только на значения с плавающей запятой:
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означает уменьшение по строкам.
[1., 2.]- это просто[ <row 1 mean> , <row 2 mean> ].это соглашение о нумерации индексов типично для программного обеспечения статистики, особенно R.
Comments