2014-11-12 25 views
21

http://deeplearning.net/tutorial/logreg.html'da verilen lojistik fonksiyonun kodunu okuyordum. Bir işlev için inputs & givens değişkenleri arasındaki fark hakkında kafam karıştı. Bir minibatch bir model tarafından yapılan hatalar hesaplamak işlevler şunlardır:'givens' değişkenlerinin amacı Theano.function

test_model = theano.function(inputs=[index], 
     outputs=classifier.errors(y), 
     givens={ 
      x: test_set_x[index * batch_size: (index + 1) * batch_size], 
      y: test_set_y[index * batch_size: (index + 1) * batch_size]}) 

validate_model = theano.function(inputs=[index], 
     outputs=classifier.errors(y), 
     givens={ 
      x: valid_set_x[index * batch_size:(index + 1) * batch_size], 
      y: valid_set_y[index * batch_size:(index + 1) * batch_size]}) 

Neden sadece/& y giriş değişkenleri paylaşılan x yapıp gerçek bir model örneği oluşturulduğunda onları tanımlanabilir izin vermedi biri olacağını olamazdı ?

cevap

23

givens parametresi, modelin açıklamasını ve girdi değişkeninin tam tanımını ayırmanıza izin verir. Bu, verilen parametrenin yaptıklarının bir sonucudur: grafiği derlemeden önce derlemek için değiştirin. Başka bir deyişle, grafikte yer alan anahtarı, ilgili değerle birlikte gristeki anahtar.

Derin öğrenme eğitiminde, modeli oluşturmak için normal bir Theano değişkeni kullanıyoruz. GPU'yu hızlandırmak için givens kullanıyoruz. Burada, veri setini CPU üzerinde tutarsak, her bir fonksiyon çağrısında bir mini-partisi GPU'ya aktarırız. Veri kümesinde birçok yineleme yaptığımızdan, veri kümesini GPU'ya çok kez aktarıyoruz. Veri kümesi GPU'ya sığacak kadar küçük olduğundan, varsa bir GPU'ya aktarılması için paylaşılan bir değişkene koyduk (veya Grafik İşleme Ünitesi devre dışı bırakılmışsa Merkezi İşlem Birimi'nde kalmaya devam ediyoruz). Ardından işlevi derlerken, girişi kullanmak için veri kümesinin mini partisine karşılık gelen bir dilim ile değiştiririz. Ardından, Theano fonksiyonunun girişi, kullanmak istediğimiz mini partinin sadece indisidir.

+0

orada değil, bu çok yararlı ve bu kavramların sahip olduğu fikirleri açıklığa kavuşturuyor, teşekkürler! – eickenberg

+0

@nouiz - Teşekkürler, anladım anlatayım: – user1245262

+0

@nouiz - Teşekkürler, anladım eğer göreyim: 1. 'Verilen' kullanımı, CPU ve GPU (ler) arasındaki Theano'nun bellek yönetimini iyileştirmektir. 2. 'Verilen' bir paylaşılan değişkeni * oluşturacaktır (sadece * eğer bir GPU'ya yerleştirilebiliyorsa). 3. Paylaşılan değişkenlerden farklı olarak, verilen değişkenler durumu koruyamaz - İşlev içinde kendileri için güncelleme oluşturamıyorum ve işlevin dışında değişirlerse, bu işleve sonraki çağrılar üzerinde hiçbir etkisi olmayacaktır ....... Herhangi bir komisyon veya ihmal hatası yaptım mı? ... Thx. (Üzgünüm - yanlışlıkla 1 yorum girildi ve çok uzun bir düzenleme yapıldı) – user1245262

1

hiçbir şeyin o şekilde yapmayı durduruluyor sanmıyorum (neden değil doğrudan bir giriş değişkeni kullanarak updates= sözlüğü çalışıyorum, ama vermedi). Ancak, verileri bir GPU'ya faydalı bir şekilde itmek için paylaşımlı bir değişkende olmanız gerekeceğini belirtiniz (bu örnekte x ve y bu örnekte alınmıştır).

+1

Peki, ne zaman/neden paylaşılan yerine verilen değişkenleri kullanmak için bir işlev tasarlarım? – user1245262

+0

kodunuzdaki givens, giriş değişkenlerini paylaşılan değişken içeriğiyle değiştiriyor, dolayısıyla givens "yerine" – eickenberg