web-dev-qa-db-ja.com

np.meanとtf.reduce_meanの違いは何ですか?

MNIST初心者向けチュートリアル には、次のステートメントがあります。

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

tf.castは基本的にオブジェクトのテンソルのタイプを変更しますが、 tf.reduce_meannp.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)で何が起こっているのでしょうか?

73
O.rka

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)

当然、numpy1によって平均を増やすことができますが、テンソルフローでそれを行うには、Sessionを使用せずにSessionでそれを実行する必要があります。言い換えると、tfMean = tf.reduce_mean(c)を計算しているとき、tensorflowはそれを計算しません。 Sessionでのみ計算します。しかし、np.mean()を記述すると、numpyは即座に計算します。

理にかなっているといいのですが。

91
Shubhashis

ここで重要なのは、関数型プログラミングの概念であるWord 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))
13
Nikhil George

新しいドキュメントでは、 tf.reduce_mean() はnp.meanと同じ結果を生成すると述べています。

Np.meanと同等

また、 np.mean とまったく同じパラメーターがあります。ただし、ここに重要な違いがあります。浮動小数点値でのみ同じ結果を生成します

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_maxなどの他の多くのreduce_prod関数は、numpyの類似物と同じ値を生成します。明らかに操作であるため、セッション内からのみ実行できます。

1
Salvador Dali