IT TIP

np.mean과 tf.reduce_mean의 차이점은 무엇입니까?

itqueen 2020. 10. 14. 21:31
반응형

np.mean과 tf.reduce_mean의 차이점은 무엇입니까?


에서 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: 줄일 텐서입니다. 숫자 유형이어야합니다.

reduction_indices: 줄일 치수입니다. (기본) 경우 None모든 치수를 줄입니다.

# '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)있습니까?


의 기능 numpy.meantensorflow.reduce_mean동일합니다. 그들은 같은 일을합니다. 문서에서 numpytensorflow의 경우이를 확인할 수 있습니다. 예를 살펴 보겠습니다.

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 연산을 계산할 수 있습니다. 그러나 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라는 단어로, TensorFlow의 reduce_mean이 입력 배치에서 계산 결과의 실행 평균을 유지할 수 있도록합니다.

함수형 프로그래밍에 익숙하지 않다면 이것은 신비스럽게 보일 수 있습니다. 그러니 먼저 reduce가 무엇을하는지 살펴 보자. [1,2,5,4]와 같은 목록을 받고 평균을 계산하라는 지시를 받았다면 간단합니다. 전체 배열을 np.mean에 전달하면 평균을 얻을 수 있습니다. 그러나 숫자 흐름의 평균을 계산해야한다면 어떨까요? 이 경우 먼저 스트림에서 읽어서 배열을 어셈블 한 다음 결과 배열에서 np.mean을 호출해야합니다. 더 많은 코드를 작성해야합니다.

대안은 축소 패러다임을 사용하는 것입니다. 예를 들어, 파이썬에서 reduce를 사용하여 숫자의 합을 계산하는 방법을 살펴보십시오 reduce(lambda x,y: x+y, [1,2,5,4]).

다음과 같이 작동합니다.

  1. 1 단계 : 목록에서 2 자리 숫자-1,2를 읽습니다. 람다 1,2를 평가합니다. reduce는 결과를 저장합니다. 3. 참고-이것은 목록에서 2 자리 숫자를 읽는 유일한 단계입니다.
  2. 2 단계 : 목록에서 다음 숫자 읽기-5. 람다 5, 3을 평가합니다 (3은 1 단계의 결과로 저장된 값을 줄임). 결과 저장 감소 8.
  3. 3 단계 : 목록에서 다음 숫자 읽기-4. 람다 8,4를 평가합니다 (8은 2 단계의 결과로 저장 됨). 결과 저장 감소 12
  4. 4 단계 : 목록에서 다음 숫자를 읽으십시오-아무것도 없으므로 저장된 결과 12를 반환하십시오.

여기 에서 파이썬으로 함수형 프로그래밍을 더 읽어보세요

To see how this applies to TensorFlow, look at the following block of code, which defines a simple graph, that takes in a float and computes the mean. The input to the graph however is not a single float but an array of floats. The reduce_mean computes the mean value over all those floats.

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}))

This pattern comes in handy when computing values over batches of images. Look at The Deep MNIST Example where you see code like:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

The new documentation states that tf.reduce_mean() produces the same results as np.mean:

Equivalent to np.mean

It also has absolutely the same parameters as np.mean. But here is an important difference: they produce the same results only on float values:

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

If you will remove type conversion, you will see different results


In additional to this, many other tf.reduce_ functions such as reduce_all, reduce_any, reduce_min, reduce_max, reduce_prod produce the same values as there numpy analogs. Clearly because they are operations, they can be executed only from inside of the session.


1 usually refers to rows, and 2 usually refers to columns. Reducing "over" index 1 means to reduce rowwise.

[1., 2.] is just [ <row 1 mean> , <row 2 mean> ].

This index numbering convention is typical in stats software, especially R.

참고URL : https://stackoverflow.com/questions/34236252/what-is-the-difference-between-np-mean-and-tf-reduce-mean

반응형