Di tutorial pemula MNIST , ada pernyataannya
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
pada dasarnya mengubah jenis tensor objek, tetapi apa perbedaan antara tf.reduce_mean
dan 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. JikaNone
(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)
?
tf.reduce_mean
multi-utas, biasanya dihitung pada GPU Anda, sedangkannp.mean
dihitung pada satu CPU. Juga,tf
dirancang untuk memproses batch data yang sedangkannp
bertindak pada contoh data tunggal.Jawaban:
Fungsionalitas
numpy.mean
dantensorflow.reduce_mean
sama. 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) ataureduction_indices
(tensorflow) adalah 1, ia menghitung mean di (3,4) dan (5,6) dan (6,7), jadi1
tentukan 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 tensorflowSession
.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
1
innumpy
seperti yang Anda lakukan secara alami, tetapi untuk melakukannya dalam tensorflow, Anda perlu melakukannya dalamSession
, tanpa menggunakanSession
Anda tidak dapat melakukannya. Dengan kata lain, saat Anda menghitungtfMean = tf.reduce_mean(c)
, tensorflow tidak menghitungnya. Itu hanya menghitung itu di fileSession
. Tapi numpy menghitungnya secara instan, saat Anda menulisnp.mean()
.Saya harap itu masuk akal.
sumber
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:
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))
sumber
tf.reduce_mean()
Status dokumentasi baru yang menghasilkan hasil yang sama seperti 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 sepertireduce_all
,reduce_any
,reduce_min
,reduce_max
,reduce_prod
menghasilkan nilai yang sama karena ada analog numpy. Jelas karena mereka adalah operasi, mereka hanya dapat dijalankan dari dalam sesi.sumber
tf.reduce_mean
memastikan bahwa keluarandtype
sesuai dengan masukandtype
. Output darinp.mean()
selalu berupa float. Apakah itu benar?1
biasanya mengacu pada baris, dan2
biasanya mengacu pada kolom. Mengurangi indeks "over"1
berarti mengurangi rowwise.[1., 2.]
hanya[ <row 1 mean> , <row 2 mean> ]
.Konvensi penomoran indeks ini tipikal dalam perangkat lunak statistik, terutama R.
sumber