Apa perbedaan antara np.mean dan tf.reduce_mean?

90

Di tutorial pemula MNIST , ada pernyataannya

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

tf.castpada dasarnya mengubah jenis tensor objek, tetapi apa perbedaan antara tf.reduce_meandan np.mean?

Ini dokumen tentang tf.reduce_mean:

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

input_tensor: Tensor yang akan dikurangi. Harus memiliki tipe numerik.

reduction_indices: Dimensi yang akan dikurangi. Jika None(defaut), kurangi semua dimensi.

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

Untuk vektor 1D, sepertinya np.mean == tf.reduce_mean, tapi saya tidak mengerti apa yang terjadi di tf.reduce_mean(x, 1) ==> [1., 2.]. tf.reduce_mean(x, 0) ==> [1.5, 1.5]jenis masuk akal, karena rata-rata [1, 2]dan [1, 2]adalah [1.5, 1.5], tapi apa yang terjadi dengan tf.reduce_mean(x, 1)?

O.rka
sumber
mereka menghasilkan hasil yang berbeda pada nilai integer karena pembagian di python
Salvador Dali
Satu perbedaan penting bagi mereka yang baru mengenal tensorflow: tf.reduce_meanmulti-utas, biasanya dihitung pada GPU Anda, sedangkan np.meandihitung pada satu CPU. Juga, tfdirancang untuk memproses batch data yang sedangkan npbertindak pada contoh data tunggal.
drevicko

Jawaban:

110

Fungsionalitas numpy.meandan tensorflow.reduce_meansama. Mereka melakukan hal yang sama. Dari dokumentasi, untuk numpy dan tensorflow , Anda bisa melihatnya. Mari kita lihat contohnya,

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)

Keluaran

[ 3.5  5.5  6.5]
[ 3.5  5.5  6.5]

Di sini Anda dapat melihat bahwa ketika axis(numpy) atau reduction_indices(tensorflow) adalah 1, ia menghitung mean di (3,4) dan (5,6) dan (6,7), jadi 1tentukan di sumbu mana mean dihitung. Jika 0, mean dihitung dari (3,5,6) dan (4,6,7), dan seterusnya. Saya harap Anda mengerti.

Sekarang apa perbedaan diantara keduanya?

Anda dapat menghitung operasi numpy di mana saja dengan python. Tetapi untuk melakukan operasi tensorflow, itu harus dilakukan di dalam tensorflow Session. Anda dapat membaca lebih lanjut di sini . Jadi, ketika Anda perlu melakukan komputasi apa pun untuk grafik tensorflow Anda (atau struktur jika Anda mau), itu harus dilakukan di dalam tensorflow Session.

Mari kita lihat contoh lainnya.

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)

Kami dapat meningkatkan mean by 1in numpyseperti yang Anda lakukan secara alami, tetapi untuk melakukannya dalam tensorflow, Anda perlu melakukannya dalam Session, tanpa menggunakan SessionAnda tidak dapat melakukannya. Dengan kata lain, saat Anda menghitung tfMean = tf.reduce_mean(c), tensorflow tidak menghitungnya. Itu hanya menghitung itu di file Session. Tapi numpy menghitungnya secara instan, saat Anda menulis np.mean().

Saya harap itu masuk akal.

Shubhashis
sumber
21
tapi apa mengurangi bagian berarti di sini?
rsht
20
@Roman itu adalah istilah dari pemrograman fungsional. Anda dapat membacanya di sini: python-course.eu/lambda.php
Daniyar
1
@rsht REDUCE = mengurangi angka dengan menjumlahkannya menjadi 1 nilai. BERARTI = rata-rata jumlah itu.
Meghna Natraj
1
@rsht Bayangkan Anda memiliki N elemen, dan Anda ingin menghitung nilai rata-rata (M) dari N angka tersebut. Cara untuk melihat masalah ini adalah bahwa kita memiliki vektor dengan ukuran (1, N) dan di atas sumbu = 0, kita mengurangi elemen (di sini kita memiliki N elemen). Reduksi (atau agregasi) hadir dengan fungsionalitas, dan dalam contoh kita, fungsinya adalah fungsi mean.
alift
23

Kuncinya di sini adalah word reduce, sebuah konsep dari pemrograman fungsional, yang memungkinkan reduce_mean di TensorFlow untuk mempertahankan rata-rata hasil komputasi yang berjalan dari sekumpulan input.

Jika Anda tidak terbiasa dengan pemrograman fungsional, ini mungkin tampak misterius. Jadi pertama-tama mari kita lihat apa yang dilakukan pengurangan. Jika Anda diberi daftar seperti [1,2,5,4] dan diminta untuk menghitung mean, itu mudah - cukup teruskan seluruh array ke np.mean dan Anda akan mendapatkan mean. Namun bagaimana jika Anda harus menghitung mean dari aliran angka? Dalam hal ini, Anda harus merakit array terlebih dahulu dengan membaca dari aliran dan kemudian memanggil np.mean pada array yang dihasilkan - Anda harus menulis kode lagi.

Alternatifnya adalah dengan menggunakan paradigma mengurangi. Sebagai contoh, lihat bagaimana kita dapat menggunakan mengurangi di python untuk menghitung jumlah angka: reduce(lambda x,y: x+y, [1,2,5,4]).

Ini bekerja seperti ini:

  1. Langkah 1: Baca 2 digit dari daftar - 1,2. Evaluasi lambda 1,2. mengurangi menyimpan hasil 3. Catatan - ini adalah satu-satunya langkah di mana 2 digit dibacakan dari daftar
  2. Langkah 2: Baca digit berikutnya dari daftar - 5. Evaluasi lambda 5, 3 (3 adalah hasil dari langkah 1, yang mengurangi disimpan). Kurangi menyimpan hasilnya 8.
  3. Langkah 3: Baca digit berikutnya dari daftar - 4. Evaluasi lambda 8,4 (8 adalah hasil dari langkah 2, yang mengurangi simpanan). kurangi menyimpan hasilnya 12
  4. Langkah 4: Baca digit berikutnya dari daftar - tidak ada, jadi kembalikan hasil tersimpan dari 12.

Baca lebih lanjut di sini Pemrograman Fungsional dengan Python

Untuk melihat bagaimana hal ini berlaku untuk TensorFlow, lihat blok kode berikut, yang mendefinisikan grafik sederhana, yang menerima float dan menghitung mean. Namun, input ke grafik bukanlah float tunggal tetapi array float. Reduce_mean menghitung nilai rata-rata di atas semua float tersebut.

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

Pola ini berguna saat menghitung nilai dari sekumpulan gambar. Lihatlah Contoh Deep MNIST di mana Anda melihat kode seperti:

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

tf.reduce_mean()Status dokumentasi baru yang menghasilkan hasil yang sama seperti np.mean:

Setara dengan np.mean

Ini juga memiliki parameter yang sama persis dengan np.mean . Tapi di sini ada perbedaan penting: mereka menghasilkan hasil yang sama hanya pada nilai 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

Jika Anda akan menghapus jenis konversi, Anda akan melihat hasil yang berbeda


Dalam tambahan untuk ini, banyak lainnya tf.reduce_fungsi seperti reduce_all, reduce_any, reduce_min, reduce_max, reduce_prodmenghasilkan nilai yang sama karena ada analog numpy. Jelas karena mereka adalah operasi, mereka hanya dapat dijalankan dari dalam sesi.

Salvador Dali
sumber
mungkin akan membantu jika Anda menjelaskan apa perbedaannya, selain contoh. Dari menjalankan contoh Anda, saya memiliki kesan yang tf.reduce_meanmemastikan bahwa keluaran dtypesesuai dengan masukan dtype. Output dari np.mean()selalu berupa float. Apakah itu benar?
craq
-1

1biasanya mengacu pada baris, dan 2biasanya mengacu pada kolom. Mengurangi indeks "over" 1berarti mengurangi rowwise.

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

Konvensi penomoran indeks ini tipikal dalam perangkat lunak statistik, terutama R.

shadowtalker
sumber
1
Saya yakin 0 merujuk ke kolom, bukan 2
hfz