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.mean
과 tensorflow.reduce_mean
동일합니다. 그들은 같은 일을합니다. 문서에서 numpy 및 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
(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 단계 : 목록에서 2 자리 숫자-1,2를 읽습니다. 람다 1,2를 평가합니다. reduce는 결과를 저장합니다. 3. 참고-이것은 목록에서 2 자리 숫자를 읽는 유일한 단계입니다.
- 2 단계 : 목록에서 다음 숫자 읽기-5. 람다 5, 3을 평가합니다 (3은 1 단계의 결과로 저장된 값을 줄임). 결과 저장 감소 8.
- 3 단계 : 목록에서 다음 숫자 읽기-4. 람다 8,4를 평가합니다 (8은 2 단계의 결과로 저장 됨). 결과 저장 감소 12
- 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.
'IT TIP' 카테고리의 다른 글
Thread.sleep 대 TimeUnit.SECONDS.sleep (0) | 2020.10.14 |
---|---|
필터 대신 withFilter (0) | 2020.10.14 |
VueJS의 Angular Service에 해당하는 것은 무엇입니까? (0) | 2020.10.14 |
bindActionCreators는 언제 react / redux에서 사용됩니까? (0) | 2020.10.14 |
Ruby에서 모듈의 인스턴스 변수를 초기화하려면 어떻게해야합니까? (0) | 2020.10.14 |