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操作は、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)
当然、numpy
の1
によって平均を増やすことができますが、テンソルフローでそれを行うには、Session
を使用せずにSession
でそれを実行する必要があります。言い換えると、tfMean = tf.reduce_mean(c)
を計算しているとき、tensorflowはそれを計算しません。 Session
でのみ計算します。しかし、np.mean()
を記述すると、numpyは即座に計算します。
理にかなっているといいのですが。
ここで重要なのは、関数型プログラミングの概念である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])
。
それはこのように動作します:
詳細はこちら 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))
新しいドキュメントでは、 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_all
、reduce_any
、reduce_min
、reduce_max
などの他の多くのreduce_prod
関数は、numpyの類似物と同じ値を生成します。明らかに操作であるため、セッション内からのみ実行できます。