Apa perbedaan antara tf.placeholder dan tf.Variable?


290

Saya seorang pemula untuk TensorFlow. Saya bingung tentang perbedaan antara tf.placeholderdan tf.Variable. Dalam pandangan saya, tf.placeholderdigunakan untuk input data, dan tf.Variabledigunakan untuk menyimpan keadaan data. Ini yang saya tahu.

Bisakah seseorang menjelaskan kepada saya lebih detail tentang perbedaan mereka? Secara khusus, kapan harus digunakan tf.Variabledan kapan harus digunakan tf.placeholder?


7
Secara intuitif, Anda ingin gradien berkenaan dengan Variables, tetapi bukan placeholders (yang nilainya harus selalu disediakan).
Yibo Yang

Kursus seperti cs231n.stanford.edu dapat membantu mereka yang bingung. Aku sangat menyukainya! Jelas ada yang lain
Nathan

Jawaban:


175

Singkatnya, Anda menggunakan tf.Variableuntuk variabel yang bisa dilatih seperti bobot (W) dan bias (B) untuk model Anda.

weights = tf.Variable(
    tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
                    stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))), name='weights')

biases = tf.Variable(tf.zeros([hidden1_units]), name='biases')

tf.placeholder digunakan untuk memberi makan contoh pelatihan aktual.

images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_PIXELS))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))

Ini adalah bagaimana Anda memberi contoh pelatihan selama pelatihan:

for step in xrange(FLAGS.max_steps):
    feed_dict = {
       images_placeholder: images_feed,
       labels_placeholder: labels_feed,
     }
    _, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)

Anda tf.variables akan dilatih (dimodifikasi) sebagai hasil dari pelatihan ini.

Lihat lebih lanjut di https://www.tensorflow.org/versions/r0.7/tutorials/mnist/tf/index.html . (Contoh diambil dari halaman web.)


2
Bagaimana jika saya ingin memproses ulang gambar saya sebelum memasukkannya? (misalnya skala ulang kontrasnya). Apakah saya sekarang memerlukan variabel untuk ini? Jika demikian, apakah memori memiliki implikasi kecepatan atau memori?
Bastiaan

1
Setiap preprocessing yang Anda lakukan akan datang sebelum memasukkan data ke dalam grafik Tensorflow (yaitu jaringan), sehingga pekerjaan itu secara teknis tidak memerlukan alat kode dari Tensorflow. Sebagai contoh, sebuah variabel tidak perlu 1. karena merupakan input data, yang dilewatkan melalui tf.placeholder (bukan variabel) dalam grafik dan 2. Proses preprocessing terjadi sebelum dimasukkan ke placeholder untuk pass saat ini melalui jaringan .
PaulG

Hanya ingin mencatat betapa saya menghargai jawaban ini. Fakta bahwa ada jauh lebih sedikit upvotes atas jawaban ini dari pada pertanyaan hanya pergi untuk menunjukkan bagaimana instan kepuasan orang bisa, dan bagaimana tag trendi seperti tensorflowdan deep learningdan AIyang.
Nathan

70

Perbedaannya adalah bahwa dengan tf.VariableAnda harus memberikan nilai awal ketika Anda mendeklarasikannya. Dengan tf.placeholderAnda tidak harus memberikan nilai awal dan Anda dapat menentukannya pada waktu berjalan dengan feed_dictargumen di dalamnyaSession.run


63
-1. Meskipun benar, ini melenceng. Perbedaan yang lebih penting adalah peran mereka dalam TensorFlow. Variabel dilatih dari waktu ke waktu, placeholder adalah data input yang tidak berubah saat kereta model Anda (seperti gambar input, dan label kelas untuk gambar-gambar itu). Seperti jawaban Sung Kim mengatakan, Anda menggunakan variabel untuk bobot dan bias dalam model Anda (meskipun tidak terbatas pada itu - untuk transfer gaya, Anda mengoptimalkan gambar dari waktu ke waktu).
Chris Anderson

@ ChrisAnderson dapatkah kita mengatakan bahwa ilustrasi ini salah ?! youtu.be/MotG3XI2qSs?t=136
N0rA

@ ChrisAnderson Mengapa penting apa artinya itu digunakan untuk, jika perbedaannya hanya satu membutuhkan nilai awal?
Goldname

1
@Goldname Bukan untuk apa "dimaksudkan" untuk digunakan - itu adalah apa yang mungkin dan tidak mungkin. Mereka benda yang sama sekali berbeda. Mereka tidak dapat dipertukarkan, dan perbedaannya lebih dari "satu membutuhkan nilai awal".
Chris Anderson

61

Karena perhitungan Tensor menyusun grafik maka lebih baik menafsirkan keduanya dalam bentuk grafik.

Ambil contoh regresi linier sederhana

WX+B=Y

di mana Wdan Bberdiri untuk bobot dan bias dan Xuntuk input pengamatan dan Yuntuk hasil pengamatan.

Jelas Xdan Ymemiliki sifat yang sama (variabel manifes) yang berbeda dari Wdan dari B(variabel laten). Xdan Yadalah nilai-nilai sampel (pengamatan) dan karenanya perlu tempat untuk diisi , sementara Wdan Bmerupakan bobot dan bias, Variabel (nilai sebelumnya mempengaruhi yang terakhir) dalam grafik yang harus dilatih menggunakan pasangan yang berbeda Xdan Y. Kami menempatkan sampel berbeda kepada Placeholder untuk melatih Variabel .

Kita hanya perlu menyimpan atau mengembalikan dengan Variabel (di pos pemeriksaan) untuk menyimpan atau membangun kembali grafik dengan kode.

Placeholder sebagian besar adalah pemegang untuk set data yang berbeda (misalnya data pelatihan atau data uji). Namun, Variabel dilatih dalam proses pelatihan untuk tugas-tugas tertentu, yaitu untuk memprediksi hasil input atau memetakan input ke label yang diinginkan. Mereka tetap sama sampai Anda melatih ulang atau menyempurnakan model menggunakan sampel yang berbeda atau sama untuk mengisi Tempat penampung sering melalui dikt. Misalnya:

 session.run(a_graph, dict = {a_placeholder_name : sample_values}) 

Placeholder juga dilewatkan sebagai parameter untuk mengatur model.

Jika Anda mengganti placeholder (menambah, menghapus, mengubah bentuk, dll.) Dari model di tengah pelatihan, Anda masih dapat memuat ulang pos pemeriksaan tanpa modifikasi lainnya. Tetapi jika variabel dari model yang disimpan diubah, Anda harus menyesuaikan pos pemeriksaan yang sesuai untuk memuatnya kembali dan melanjutkan pelatihan (semua variabel yang ditentukan dalam grafik harus tersedia di pos pemeriksaan).

Singkatnya, jika nilainya berasal dari sampel (pengamatan yang sudah Anda miliki), Anda dengan aman membuat placeholder untuk menahannya, sementara jika Anda membutuhkan parameter untuk dilatih memanfaatkan Variabel (cukup cantumkan, tetapkan Variabel untuk nilai yang Anda inginkan untuk menggunakan TF secara otomatis).

Dalam beberapa model yang menarik, seperti model pemindahan gaya , piksel input akan dioptimalkan dan variabel model yang biasa disebut diperbaiki, maka kita harus membuat input (biasanya diinisialisasi secara acak) sebagai variabel seperti yang diterapkan pada tautan itu.

Untuk informasi lebih lanjut silahkan mengambil kesimpulan untuk ini sederhana dan menggambarkan doc .


38

TL; DR

Variabel

  • Agar parameter dapat dipelajari
  • Nilai dapat diturunkan dari pelatihan
  • Nilai awal diperlukan (seringkali acak)

Placeholder

  • Penyimpanan yang dialokasikan untuk data (seperti untuk data piksel gambar selama umpan)
  • Nilai awal tidak diperlukan (tetapi dapat diatur, lihat tf.placeholder_with_default)

34

Perbedaan yang paling jelas antara tf.Variable dan tf.placeholder adalah itu


Anda menggunakan variabel untuk menyimpan dan memperbarui parameter. Variabel adalah buffer dalam memori yang mengandung tensor. Mereka harus diinisialisasi secara eksplisit dan dapat disimpan ke disk selama dan setelah pelatihan. Anda nanti dapat mengembalikan nilai yang disimpan untuk berolahraga atau menganalisis model.

Inisialisasi variabel dilakukan dengan sess.run(tf.global_variables_initializer()). Juga saat membuat variabel, Anda harus meneruskan Tensor sebagai nilai awal ke Variable()konstruktor dan ketika Anda membuat variabel Anda selalu tahu bentuknya.


Di sisi lain, Anda tidak dapat memperbarui placeholder. Mereka juga tidak boleh diinisialisasi, tetapi karena itu adalah janji untuk memiliki tensor, Anda perlu memasukkan nilai tersebut ke dalamnya sess.run(<op>, {a: <some_val>}). Dan akhirnya, dibandingkan dengan variabel, placeholder mungkin tidak tahu bentuknya. Anda dapat memberikan bagian dari dimensi atau tidak memberikan apa pun.


Ada perbedaan lain:

Bagian yang menarik adalah bahwa tidak hanya placeholder yang dapat diberi makan. Anda bisa memberi makan nilai ke variabel dan bahkan ke konstanta.


14

Menambah jawaban orang lain, mereka juga menjelaskannya dengan sangat baik dalam tutorial MNIST ini di situs web Tensoflow:

Kami menggambarkan operasi yang saling berinteraksi ini dengan memanipulasi variabel simbolik. Mari kita buat satu:

x = tf.placeholder(tf.float32, [None, 784]),

xbukan nilai tertentu. Ini adalah placeholder, nilai yang akan kami masukkan ketika kami meminta TensorFlow untuk menjalankan perhitungan. Kami ingin dapat memasukkan sejumlah gambar MNIST, masing-masing diratakan menjadi vektor 784 dimensi. Kami menyatakan ini sebagai tensor 2-D dari angka floating-point, dengan bentuk [Tidak ada, 784]. (Di sini, Tidak Ada Yang berarti bahwa dimensi bisa panjang.)

Kita juga membutuhkan bobot dan bias untuk model kita. Kita bisa membayangkan memperlakukan ini seperti input tambahan, tetapi TensorFlow memiliki cara yang lebih baik untuk menanganinya: Variable. A Variableadalah tensor yang dapat dimodifikasi yang hidup dalam grafik operasi interaksi TensorFlow. Itu dapat digunakan dan bahkan dimodifikasi oleh perhitungan. Untuk aplikasi pembelajaran mesin, seseorang umumnya memiliki parameter model menjadi Variables.

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

Kami membuat ini Variabledengan memberikan tf.Variablenilai awal dari Variable: dalam hal ini, kami menginisialisasi keduanya Wdan bsebagai tensor penuh dengan nol. Karena kita akan belajar Wdan b, tidak masalah apa yang mereka awalnya.


hai terima kasih atas jawaban Anda! Pada contoh yang Anda berikan, kami memiliki xbentuk [batch size, features], kami memiliki bobot mulai dari input ke lapisan pertama ukuran [features, hidden units]dan bias [hidden units]. Jadi pertanyaan saya adalah: bagaimana kita melipatgandakannya? Jika kita lakukan tf.matmul(x, w)maka kita akan mendapatkan [batch size, hidden units]dan kita tidak bisa bmelakukannya, karena itu memiliki bentuk[hidden units]
Euler_Salter

1
M.Gorner menjelaskan semua ini dalam tayangan slidenya, "Pelajari TensorFlow dan pembelajaran mendalam, tanpa gelar Ph.D." lebih baik daripada yang bisa saya lakukan di sini di komentar ini. Jadi, izinkan saya merujuk slide ini: docs.google.com/presentation/d/…
tagoma

11

Tensorflow menggunakan tiga jenis wadah untuk menyimpan / menjalankan proses

  1. Konstanta: Konstanta memegang data khas.

  2. variabel: Nilai data akan diubah, dengan masing-masing fungsi seperti cost_function ..

  3. placeholder: Data Pelatihan / Pengujian akan diteruskan ke grafik.


10

Cuplikan contoh:

import numpy as np
import tensorflow as tf

### Model parameters ###
W = tf.Variable([.3], tf.float32)
b = tf.Variable([-.3], tf.float32)

### Model input and output ###
x = tf.placeholder(tf.float32)
linear_model = W * x + b
y = tf.placeholder(tf.float32)

### loss ###
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares

### optimizer ###
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

### training data ###
x_train = [1,2,3,4]
y_train = [0,-1,-2,-3]

### training loop ###
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(1000):
  sess.run(train, {x:x_train, y:y_train})

Seperti namanya placeholder adalah janji untuk memberikan nilai yaitu nanti

Variabel hanyalah parameter pelatihan ( W(matriks), b(bias) yang sama dengan variabel normal yang Anda gunakan dalam pemrograman sehari-hari, yang diperbarui / dimodifikasi oleh pelatih pada setiap langkah / lari.

Sementara placeholder tidak memerlukan nilai awal, bahwa ketika Anda membuat xdan yTF tidak mengalokasikan memori apa pun, sebaliknya nanti saat Anda memberi makan placeholder dalam sess.run()penggunaan feed_dict, TensorFlow akan mengalokasikan memori berukuran tepat untuk mereka ( xdan y) - ini tidak dibatasi- ness memungkinkan kita untuk memberi makan berbagai ukuran dan bentuk data.


Singkatnya :

Variabel - adalah parameter yang Anda ingin agar pelatih (yaitu GradientDescentOptimizer) diperbarui setelah setiap langkah.

Demo Placeholder -

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b  # + provides a shortcut for tf.add(a, b)

Eksekusi:

print(sess.run(adder_node, {a: 3, b:4.5}))
print(sess.run(adder_node, {a: [1,3], b: [2, 4]}))

menghasilkan output

7.5
[ 3.  7.]

Dalam kasus pertama 3 dan 4.5 akan diteruskan ke adan bmasing - masing, dan kemudian ke adder_node ouputting 7. Dalam kasus kedua ada daftar umpan, langkah pertama 1 dan 2 akan ditambahkan, 3 dan 4 berikutnya ( adan b).


Bacaan yang relevan:


7

Variabel

Variabel TensorFlow adalah cara terbaik untuk mewakili keadaan persisten yang dimanipulasi oleh program Anda. Variabel dimanipulasi melalui kelas tf.Variable. Secara internal, tf. Variabel menyimpan tensor persisten. Operasi spesifik memungkinkan Anda membaca dan memodifikasi nilai tensor ini. Modifikasi ini terlihat di beberapa tf.Sesi, sehingga beberapa pekerja dapat melihat nilai yang sama untuk tf.Variabel. Variabel harus diinisialisasi sebelum menggunakan.

Contoh:

x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2

Ini membuat grafik perhitungan. Variabel (x dan y) dapat diinisialisasi dan fungsi (f) dievaluasi dalam sesi tensorflow sebagai berikut:

with tf.Session() as sess:
     x.initializer.run()
     y.initializer.run()
     result = f.eval()
print(result)
42

Placeholder

Placeholder adalah simpul (sama dengan variabel) yang nilainya dapat diinisialisasi di masa mendatang. Node-node ini pada dasarnya menampilkan nilai yang diberikan padanya selama runtime. Node placeholder dapat ditugaskan menggunakan kelas tf.placeholder () di mana Anda bisa memberikan argumen seperti jenis variabel dan / atau bentuknya. Placeholder secara luas digunakan untuk mewakili dataset pelatihan dalam model pembelajaran mesin karena dataset pelatihan terus berubah.

Contoh:

A = tf.placeholder(tf.float32, shape=(None, 3))
B = A + 5

Catatan: 'Tidak Ada' untuk dimensi berarti 'ukuran apa pun'.

with tf.Session as sess:
    B_val_1 = B.eval(feed_dict={A: [[1, 2, 3]]})
    B_val_2 = B.eval(feed_dict={A: [[4, 5, 6], [7, 8, 9]]})

print(B_val_1)
[[6. 7. 8.]]
print(B_val_2)
[[9. 10. 11.]
 [12. 13. 14.]]

Referensi:

  1. https://www.tensorflow.org/guide/variables
  2. https://www.tensorflow.org/api_docs/python/tf/placeholder
  3. O'Reilly: Pembelajaran Mesin Langsung dengan Scikit-Learn & Tensorflow

6

Anggap Variabledalam tensorflow sebagai variabel normal yang kita gunakan dalam bahasa pemrograman. Kami menginisialisasi variabel, kami dapat memodifikasinya nanti. Padahal placeholdertidak membutuhkan nilai awal. Placeholder hanya mengalokasikan blok memori untuk digunakan di masa mendatang. Nanti, kita bisa gunakan feed_dictuntuk memasukkan data placeholder. Secara default, placeholdermemiliki bentuk yang tidak dibatasi, yang memungkinkan Anda untuk memberi makan tensor bentuk yang berbeda dalam satu sesi. Anda dapat membuat bentuk dibatasi dengan melewati argumen opsional -bentuk, seperti yang telah saya lakukan di bawah ini.

x = tf.placeholder(tf.float32,(3,4))
y =  x + 2

sess = tf.Session()
print(sess.run(y)) # will cause an error

s = np.random.rand(3,4)
print(sess.run(y, feed_dict={x:s}))

Saat melakukan tugas Machine Learning, sebagian besar waktu kita tidak mengetahui jumlah baris tetapi (mari kita asumsikan) kita mengetahui jumlah fitur atau kolom. Dalam hal ini, kita dapat menggunakan Tidak Ada.

x = tf.placeholder(tf.float32, shape=(None,4))

Sekarang, pada saat run time kita dapat memberi makan setiap matriks dengan 4 kolom dan jumlah baris.

Selain itu, Placeholder digunakan untuk memasukkan data (mereka adalah jenis variabel yang kami gunakan untuk memberi makan model kami), sedangkan Variabel adalah parameter seperti bobot yang kami latih seiring waktu.


4

Placeholder:

  1. Placeholder hanyalah variabel yang akan kami tetapkan datanya di kemudian hari. Itu memungkinkan kami untuk membuat operasi kami dan membangun grafik perhitungan kami, tanpa perlu data. Dalam terminologi TensorFlow, kami kemudian memasukkan data ke dalam grafik melalui placeholder ini.

  2. Nilai awal tidak diperlukan tetapi dapat memiliki nilai default dengan tf.placeholder_with_default)

  3. Kami harus memberikan nilai saat runtime seperti:

    a = tf.placeholder(tf.int16) // initialize placeholder value
    b = tf.placeholder(tf.int16) // initialize placeholder value
    
    use it using session like :
    
    sess.run(add, feed_dict={a: 2, b: 3}) // this value we have to assign at runtime

Variabel :

  1. Variabel TensorFlow adalah cara terbaik untuk mewakili keadaan persisten yang dimanipulasi oleh program Anda.
  2. Variabel dimanipulasi melalui kelas tf.Variable. Sebuah tf.Variable mewakili tensor yang nilainya dapat diubah dengan menjalankan ops di atasnya.

Contoh: tf.Variable("Welcome to tensorflow!!!")


3

Tensorflow 2.0 Kompatibel Jawaban : Konsep Placeholder, tf.placeholdertidak akan tersedia Tensorflow 2.x (>= 2.0)secara default, karena Mode Eksekusi Default adalah Eksekusi bersemangat.

Namun, kita dapat menggunakannya jika digunakan dalam Graph Mode( Disable Eager Execution).

Perintah Setara untuk TF Placeholder dalam versi 2.x adalah tf.compat.v1.placeholder.

Perintah Setara untuk Variabel TF dalam versi 2.x adalah tf.Variabledan jika Anda ingin memigrasi kode dari 1.x ke 2.x, perintah yang setara adalah

tf.compat.v2.Variable.

Silakan merujuk halaman Tensorflow ini untuk informasi lebih lanjut tentang Tensorflow Version 2.0.

Silakan merujuk Panduan Migrasi untuk informasi lebih lanjut tentang migrasi dari versi 1.x ke 2.x.


2

Pikirkan grafik perhitungan . Dalam grafik seperti itu, kita membutuhkan simpul input untuk meneruskan data kita ke grafik, simpul tersebut harus didefinisikan sebagai Placeholder dalam tensorflow .

Jangan berpikir sebagai program umum dengan Python. Anda dapat menulis program Python dan melakukan semua hal yang dijelaskan oleh orang-orang di jawaban lain hanya dengan Variabel, tetapi untuk grafik perhitungan di tensorflow, untuk memberi makan data Anda ke grafik, Anda perlu mendefinisikan anggukan tersebut sebagai Placeholder.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.