Np.mean ve tf.reduce_mean arasındaki fark nedir?


92

Gelen MNIST acemi öğretici , deyim vardır

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

tf.casttemelde nesnenin olduğu tensör türünü değiştirir, ancak tf.reduce_meanve arasındaki fark nedirnp.mean nedir?

İşte dokümanı tf.reduce_mean:

reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)

input_tensor: Azaltılacak tensör. Sayısal türe sahip olmalıdır.

reduction_indices: Azaltılacak boyutlar. Eğer None(varsayılan), tüm boyutları küçültür.

# '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.]

Bir 1B vektör için, öyle görünüyor np.mean == tf.reduce_mean, ama içinde ne olduğunu anlamıyorum tf.reduce_mean(x, 1) ==> [1., 2.]. tf.reduce_mean(x, 0) ==> [1.5, 1.5]Ortalama [1, 2]ve [1, 2]olduğu için biraz mantıklı, [1.5, 1.5]ama neler oluyor tf.reduce_mean(x, 1)?


python'daki bölünme nedeniyle tamsayı değerlerinde farklı sonuçlar üretirler
Salvador Dali

Tensorflow'da yeni olanlar için önemli bir fark: tf.reduce_meançok iş parçacıklıdır, genellikle GPU'nuzda hesaplanır, oysa np.meantek bir CPU üzerinde hesaplanır. Ayrıca, tek bir veri örneği üzerinde hareket ederken ,tf bir grup veriyi işlemek için tasarlanmıştır np.
drevicko

Yanıtlar:


114

İşlevselliği numpy.meanve tensorflow.reduce_meanaynıdır. Aynı şeyi yapıyorlar. Belgeler, için Numpy ve tensorflow , bunu görebilirsiniz. Bir örneğe bakalım,

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)

Çıktı

[ 3.5  5.5  6.5]
[ 3.5  5.5  6.5]

Burada axis(numpy) veya reduction_indices(tensorflow) 1 olduğunda, (3,4) ve (5,6) ve (6,7) 1boyunca ortalamayı hesapladığını , dolayısıyla ortalamanın hangi eksen boyunca hesaplandığını tanımladığını görebilirsiniz. 0 olduğunda, ortalama (3,5,6) ve (4,6,7) arasında hesaplanır ve bu şekilde devam eder. Umarım anlarsın.

Şimdi aralarındaki farklar nelerdir?

Numpy işlemini python üzerinde herhangi bir yerde hesaplayabilirsiniz. Ancak tensorflow işlemi yapabilmek için tensorflow içinde yapılmalıdır Session. Bu konuda daha fazla bilgi bulabilirsiniz burada . Dolayısıyla, tensorflow grafiğiniz (veya yaparsanız yapınız) için herhangi bir hesaplama yapmanız gerektiğinde, bir tensorflow içinde yapılmalıdır Session.

Başka bir örneğe bakalım.

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)

Biz tarafından ortalama artış olabilir 1de numpydoğal olduğu gibi, ama tensorflow bunu yapmak için, sen o gerçekleştirmek için gereken Sessionkullanmadan, Sessionbunu yapamaz. Diğer bir deyişle, siz hesaplarken tfMean = tf.reduce_mean(c), tensorflow bunu hesaplamaz. Yalnızca bunu bir Session. Ama numpy bunu yazarken anında hesaplar np.mean().

Umarım mantıklıdır.


23
ama burada azaltma parçası ne anlama geliyor ?
rsht

22
@Roman, işlevsel programlamadan bir terimdir. buradan okuyabilirsiniz: python-course.eu/lambda.php
Daniyar

1
@rsht REDUCE = sayıları 1 değere kadar toplayarak azaltır. ORTALAMA = bu toplamın ortalaması.
Meghna Natraj

1
@rsht N öğeniz olduğunu ve bu N sayıların ortalama değerini (M) hesaplamak istediğinizi varsayalım. Bu sorunu görmenin bir yolu, bir boyut vektörümüzün (1, N) olması ve eksen üzerinde = 0, elemanları azaltmamızdır (burada N elemanımız var). Azaltma (veya toplama) bir işlevsellikle birlikte gelir ve örneğimizde işlev, ortalama işlevdir.
2019

23

Buradaki anahtar, işlevsel programlamadan bir kavram olan azaltma kelimesidir. reduce_mean , TensorFlow'da bir grup girdiden hesaplamaların sonuçlarının ortalama bir ortalamasını tutmayı .

İşlevsel programlamaya aşina değilseniz, bu gizemli görünebilir. Öyleyse önce ne yaptığını görelim reduce. Size [1,2,5,4] gibi bir liste verildiyse ve ortalamayı hesaplamanız söylendiyse, bu kolaydır - sadece tüm diziyi iletin ve ortalamayı np.meanelde edin. Ancak, bir sayı akışının ortalamasını hesaplamanız gerekirse ne olur? Bu durumda, diziyi önce akımdan okuyarak ve ardından çağırarak birleştirmeniz gerekir.np.mean ortaya çıkan diziyi gerekir - biraz daha kod yazmanız gerekir.

Bir alternatif, azaltma paradigmasını kullanmaktır. Örnek olarak, sayıların toplamını hesaplamak için python'da azaltmayı nasıl kullanabileceğimize bakın: reduce(lambda x,y: x+y, [1,2,5,4]) .

Şu şekilde çalışır:

  1. Adım 1: Listeden 2 hane okuyun - 1,2. Lambda 1,2'yi değerlendirin. azalt, sonucu depolar 3. Not - bu, listeden 2 rakamın okunduğu tek adımdır
  2. Adım 2: Listeden bir sonraki basamağı okuyun - 5. lambda 5, 3'ü değerlendirin (saklanan azaltan, 1. adımın sonucu 3'tür). azaltmak sonucu depolar 8.
  3. Adım 3: Listeden sonraki basamağı okuyun - 4. lambda 8,4'ü değerlendirin (saklanan azaltan adım 2'nin sonucu 8'dir). küçült depolar sonucu 12
  4. Adım 4: Listeden sonraki basamağı okuyun - hiçbiri yok, bu nedenle 12'nin saklanan sonucunu döndürün.

Daha fazlasını buradan okuyun Python'da İşlevsel Programlama hakkında

Bunun TensorFlow için nasıl geçerli olduğunu görmek için, bir kayan nokta alan ve ortalamayı hesaplayan basit bir grafiği tanımlayan aşağıdaki kod bloğuna bakın. Ancak grafiğin girdisi tek bir kayan nokta değil, bir yüzer dizidir. reduce_meanTüm bu yüzen üzerinde ortalama değerini hesaplar.

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}))

Bu desen, görüntü yığınları üzerinden değerleri hesaplarken kullanışlıdır. Bak Derin MNIST Örneği sizin gibi kod bakın:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

4

Yeni dokümantasyon tf.reduce_mean(), np.mean ile aynı sonuçları verdiğini belirtir:

Np.mean ile eşdeğer

Ayrıca np.mean ile kesinlikle aynı parametrelere sahiptir . Ancak burada önemli bir fark var: Aynı sonuçları yalnızca kayan değerlerde üretirler :

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

Tür dönüştürmeyi kaldırırsanız, farklı sonuçlar göreceksiniz


Buna ek olarak, pek çok diğer tf.reduce_işlevleri gibi reduce_all, reduce_any, reduce_min, reduce_max, reduce_prodorada numpy analogları gibi aynı değerleri üretir. Açıkçası bunlar operasyon oldukları için sadece oturumun içinden yürütülebilirler.


Örneğe ek olarak, farkın ne olduğunu açıklamanız yardımcı olabilir. Örneğinizi çalıştırdığımda tf.reduce_mean, çıktının dtypegirişle eşleşmesini sağlayan izlenimim var dtype. Çıktısı np.mean()her zaman bir şamandıradır. Bu doğru mu?
craq

-1

1genellikle satırlara ve 2genellikle sütunlara atıfta bulunur. "Aşırı" endeksinin azaltılması1 azaltmak, satır bazında azaltmak demektir.

[1., 2.] sadece [ <row 1 mean> , <row 2 mean> ] .

Bu dizin numaralandırma kuralı, istatistik yazılımında, özellikle R.


1
0'ın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.