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


90

에서 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]의 mean [1, 2][1, 2]is 이므로 의미 가 있습니다 [1.5, 1.5].하지만 무슨 일이 일어나고 tf.reduce_mean(x, 1)있습니까?


그들은 파이썬의 분할로 인해 정수 값에 대해 다른 결과를 생성합니다
Salvador Dali

tensorflow를 처음 접하는 사람들에게 중요한 차이점 tf.reduce_mean은 멀티 스레드이며 일반적으로 GPU에서 np.mean계산 되는 반면 단일 CPU에서 계산 된다는 것 입니다. 또한, tf공정 설계 데이터의 일괄 반면 np단일 데이터 인스턴스에 작용한다.
drevicko 19

답변:


110

의 기능 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().

이해가 되길 바랍니다.


21
하지만 여기서 부분 감소 는 무엇을 의미 합니까?
rsht 2016

20
@Roman 함수형 프로그래밍의 용어입니다. 당신은 여기에서 그것에 대해 읽을 수 있습니다 : python-course.eu/lambda.php
Daniyar

1
@rsht REDUCE = 값을 1 개까지 합산하여 숫자를 줄입니다. MEAN = 그 합계의 평균.
Meghna Natraj

1
@rsht N 개의 요소가 있고 그 N 개의 숫자의 평균값 (M)을 계산한다고 가정합니다. 이 문제를 확인하는 방법은 크기 (1, N)의 벡터가 있고 축 = 0에서 요소를 줄이는 것입니다 (여기서는 N 개의 요소가 있음). 감소 (또는 집계)는 기능과 함께 제공되며,이 예에서 함수는 평균 함수입니다.
alift

23

여기서 핵심은 함수형 프로그래밍의 개념 인 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를 반환하십시오.

여기 에서 더 많은 것을 읽으십시오 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))

3

새 문서 tf.reduce_mean()는 np.mean과 동일한 결과 를 생성 한다고 설명 합니다.

np.mean과 동일

또한 np.mean 과 절대적으로 동일한 매개 변수를 가지고 있습니다. 그러나 여기에 중요한 차이점이 있습니다. 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

유형 변환을 제거하면 다른 결과가 표시됩니다.


이에 추가로, 많은 다른 tf.reduce_기능과 같은 reduce_all, reduce_any, reduce_min, reduce_max, reduce_prod이 유사체 NumPy와 같은 값을 생성한다. 작업이기 때문에 세션 내부에서만 실행할 수 있습니다.


예와 함께 차이점을 설명하면 도움이 될 수 있습니다. 귀하의 예제를 실행 tf.reduce_mean하면 출력 dtype이 입력과 일치 하는지 확인하는 인상이 dtype있습니다. 의 출력 np.mean()은 항상 부동 소수점입니다. 그 맞습니까?
craq

-1

1일반적으로 행을 나타내며 2일반적으로 열을 나타냅니다. "over"인덱스 1를 줄이는 것은 행 단위로 줄이는 것을 의미합니다.

[1., 2.]입니다 [ <row 1 mean> , <row 2 mean> ].

이 인덱스 번호 지정 규칙은 통계 소프트웨어, 특히 R에서 일반적입니다.


1
나는 0 컬럼이 아닌이 의미 생각
HFZ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.