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]種類作るのは、平均するので、感知[1, 2][1, 2]ある[1.5, 1.5]が、何をして起こっているのtf.reduce_mean(x, 1)



tensorflowを初めて使用する場合の重要な違いの1つtf.reduce_meanは、マルチスレッドであり、通常np.meanはGPUで計算されますが、単一のCPUで計算されます。また、単一のデータインスタンスで動作するのに対して、データのバッチtfを処理するように設計されています。np
drevicko

回答:


110

機能numpy.meantensorflow.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演算は、Pythonの任意の場所で計算できます。ただし、テンソルフロー操作を行うには、テンソルフロー内で行う必要があります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)

我々はによって平均増加する可能性が1numpyあなたが自然と同じように、しかしtensorflowでそれを行うためには、あなたはその中を実行する必要がSession使用しなくても、Sessionあなたがそれを行うことはできません。つまり、を計算しているときtfMean = tf.reduce_mean(c)、テンソルフローはそれを計算しません。それだけでそれを計算しSessionます。しかしnumpyは、あなたがを書いnp.mean()たときに即座にそれを計算します。

私はそれが理にかなっていると思います。


21
しかし、ここで削減部分とはどういう意味ですか?
rsht

20
@Romanそれは関数型プログラミングからの用語です。あなたはここでそれについて読むことができます:python-course.eu/lambda.php
Daniyar

1
@rsht REDUCE = 1つの値まで合計して数を減らします。MEAN =その合計を平均します。
Meghna Natraj

1
@rsht N個の要素があり、それらのN個の数値の平均値(M)を計算するとします。この問題を確認する方法は、サイズ(1、N)のベクトルがあり、axis = 0で要素を減らすことです(ここではN個の要素があります)。削減(または集計)には機能が付属しており、この例では、関数は平均関数です。
19

22

ここで重要なのは、reduceという単語です。これは、関数型プログラミングの概念であり、TensorFlowのreduce_meanが入力のバッチからの計算結果の移動平均を維持できるようにします。

関数型プログラミングに慣れていない場合、これは不思議に思えるかもしれません。それではまず、reduceが何を行うかを見てみましょう。[1,2,5,4]のようなリストが与えられ、平均を計算するように指示された場合、それは簡単です。配列全体をnp.meanに渡すだけで、平均を取得できます。ただし、一連の数値の平均を計算する必要がある場合はどうでしょうか。その場合、最初にストリームから読み取って配列を組み立て、次に結果の配列でnp.meanを呼び出す必要があります。さらにいくつかのコードを記述する必要があります。

別の方法は、reduceパラダイムを使用することです。例として、Pythonで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にどのように適用されるかを確認するには、フロートを取り、平均を計算する単純なグラフを定義する次のコードブロックを見てください。ただし、グラフへの入力は単一の浮動小数点数ではなく、浮動小数点数の配列です。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}))

このパターンは、画像のバッチに対して値を計算するときに便利です。次のようなコードが表示されるThe Deep MNIST Exampleを見てください。

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_allreduce_anyreduce_minreduce_maxreduce_prodがnumpyの類似体と同じ値を生成します。明らかに、これらは操作であるため、セッションの内部からのみ実行できます。


例に加えて、違いを説明すると役立つ場合があります。あなたの例を実行tf.reduce_meanすると、出力dtypeが入力と一致することを保証する印象がありますdtype。の出力np.mean()は常に浮動小数点です。あれは正しいですか?
craq 2007

-1

1通常は行を指し、2通常は列を指します。「オーバー」インデックス1を減らすことは、行ごとに減らすことを意味します。

[1., 2.]ただ[ <row 1 mean> , <row 2 mean> ]です。

このインデックス番号付け規則は、統計ソフトウェア、特にRで一般的です。


1
私は0は2ではなく列を参照していると思います
hfz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.