Разница между НП.значит и ТФ.уменьшить среднее значение в 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)?

730   4  

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. Шаг 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}))

этот шаблон пригодится при вычислении значений по пакетам изображений. Посмотри на глубокий пример 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

    Ничего не найдено.