No tutorial do iniciante MNIST , há a instrução
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
basicamente muda o tipo de tensor do objeto, mas qual é a diferença entre tf.reduce_mean
e np.mean
?
Aqui está o documento sobre tf.reduce_mean
:
reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
input_tensor
: O tensor a ser reduzido. Deve ter tipo numérico.
reduction_indices
: As dimensões a reduzir. SeNone
(o padrão), reduz todas as dimensões.# '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.]
Para um vetor 1D, parece np.mean == tf.reduce_mean
, mas não entendo o que está acontecendo em tf.reduce_mean(x, 1) ==> [1., 2.]
. tf.reduce_mean(x, 0) ==> [1.5, 1.5]
meio que faz sentido, uma vez que significa [1, 2]
e [1, 2]
é [1.5, 1.5]
, mas o que está acontecendo tf.reduce_mean(x, 1)
?
tf.reduce_mean
é multi-threaded, normalmente calculado em sua GPU, enquantonp.mean
é calculado em uma única CPU. Além disso,tf
é projetado para processar um lote de dados enquantonp
atua em uma única instância de dados.Respostas:
As funcionalidades de
numpy.mean
etensorflow.reduce_mean
são as mesmas. Eles fazem a mesma coisa. Na documentação, para numpy e tensorflow , você pode ver isso. Vejamos um exemplo,Resultado
Aqui você pode ver que quando
axis
(numpy) oureduction_indices
(tensorflow) é 1, ele calcula a média em (3,4) e (5,6) e (6,7), então1
define em qual eixo a média é calculada. Quando é 0, a média é calculada em (3,5,6) e (4,6,7), e assim por diante. Espero que você tenha a idéia.Agora, quais são as diferenças entre eles?
Você pode calcular a operação numpy em qualquer lugar no python. Mas para fazer uma operação de tensorflow, ela deve ser feita dentro de um tensorflow
Session
. Você pode ler mais sobre isso aqui . Portanto, quando você precisar realizar qualquer cálculo para seu gráfico de tensorflow (ou estrutura, se preferir), deve ser feito dentro de um tensorflowSession
.Vejamos outro exemplo.
Poderíamos aumentar a média por
1
innumpy
como você faria naturalmente, mas para fazê-lo em tensorflow, você precisa executar emSession
, sem usarSession
você não pode fazer isso. Em outras palavras, quando você está computandotfMean = tf.reduce_mean(c)
, o tensorflow não o computa. Ele apenas calcula isso em aSession
. Mas o numpy calcula isso instantaneamente, quando você escrevenp.mean()
.Eu espero que faça sentido.
fonte
A chave aqui é a palavra reduzir, um conceito da programação funcional, que torna possível para a redução_mean no TensorFlow manter uma média dos resultados dos cálculos de um lote de entradas.
Se você não está familiarizado com a programação funcional, isso pode parecer misterioso. Então, primeiro vamos ver o que reduz. Se você recebeu uma lista como [1,2,5,4] e foi instruído a calcular a média, isso é fácil - apenas passe o array inteiro para np.mean e você obterá a média. No entanto, e se você tivesse que calcular a média de um fluxo de números? Nesse caso, você teria que primeiro montar o array lendo o stream e então chamar np.mean no array resultante - você teria que escrever mais algum código.
Uma alternativa é usar o paradigma de redução. Como exemplo, veja como podemos usar reduzir em python para calcular a soma dos números:
reduce(lambda x,y: x+y, [1,2,5,4])
.Funciona assim:
Leia mais aqui Programação Funcional em Python
Para ver como isso se aplica ao TensorFlow, observe o seguinte bloco de código, que define um gráfico simples, que pega um ponto flutuante e calcula a média. A entrada para o gráfico, entretanto, não é um único flutuante, mas uma matriz de flutuantes. Reduza_mean calcula o valor médio de todos esses flutuadores.
Esse padrão é útil ao calcular valores em lotes de imagens. Veja o exemplo de The Deep MNIST, onde você vê um código como:
fonte
A nova documentação afirma que
tf.reduce_mean()
produz os mesmos resultados que np.mean:Ele também tem absolutamente os mesmos parâmetros que np.mean . Mas aqui está uma diferença importante: eles produzem os mesmos resultados apenas em valores flutuantes :
Se você remover a conversão de tipo, verá resultados diferentes
Em adicional para isso, muitas outras
tf.reduce_
funções, tais comoreduce_all
,reduce_any
,reduce_min
,reduce_max
,reduce_prod
produzir os mesmos valores que lá análogos numpy. Obviamente, por serem operações, elas podem ser executadas apenas de dentro da sessão.fonte
tf.reduce_mean
garante que a saídadtype
corresponda à entradadtype
. A saída denp.mean()
é sempre um float. Isso está correto?1
geralmente se refere a linhas e2
geralmente se refere a colunas. Reduzir o índice "acima"1
significa reduzir o número de linhas.[1., 2.]
é justo[ <row 1 mean> , <row 2 mean> ]
.Esta convenção de numeração de índice é típica em software de estatísticas, especialmente R.
fonte