2015-07-18 15 views
12

Theano (http://deeplearning.net/tutorial/lstm.html) için LSTM öğreticisini kullanıyorum.Python'da Dizgi indekslemede Yok Kullanılıyor

c = m_[:, None] * c + (1. - m_)[:, None] * c_ 

m_[:, None] ne anlama gelir: lstm.py (http://deeplearning.net/tutorial/code/lstm.py) dosyasında aşağıdaki satırı anlamıyorum? Bu durumda m_ theano vektörü iken c bir matristir.

+0

olarak elde, ama buna sizinle ilgilenen sözdizimi tanıtır numpy uyumlu entegrasyon vardır görünüyor olabilir: http: // docs. scipy.org/doc/numpy/reference/arrays.indexing.html –

+2

Ondrej Slinták doğru. Https://github.com/Theano/Theano'da kodun üzerinden bakmak, Theano tensörleri NumPy dizileri olarak uygulanır ve lstm.py, slice() öğesinin 2 veya 3 boyutlu bir NumPy dizisi döndürdüğünü gösterir. NumPy.array dilimlemesi ile Yok, bir diziye bir eksen (boyut) ekleyen newaxis nesnesiyle aynı değildir, bu nedenle m_ [:, Yok], m_ öğesinin her öğesini bir dizide örter; np olarak ithalat numpy verilen; a = np.array ([[1,2], [3,4]]), sonra bir [:, Yok] np.array ([[[1, 2]], [[3, 4]]]) –

+0

Temel bir öğretici dersi ve ardından Theano öğreticisini takip ettiğinizden emin olun. Bu çok soruya cevap verecektir. – eickenberg

cevap

7

Bu soru Theano postalama listesinde sorulmuş ve cevaplanmıştır, ancak aslında numpy endekslemenin temelleri hakkındadır. İşte

soru ve bütünlüğü için https://groups.google.com/forum/#!topic/theano-users/jq92vNtkYUI

cevap, burada başka bir açıklaması var: None ile dilimleme o Numpy ve Theano hem de aynı şekilde davranır, çünkü ilgili numpy belgelerine bakın sizin diziye bir ekseni ekler :

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#numpy.newaxis

Not np.newaxis is None o:

import numpy as np 
a = np.arange(30).reshape(5, 6) 

print a.shape # yields (5, 6) 
print a[np.newaxis, :, :].shape # yields (1, 5, 6) 
print a[:, np.newaxis, :].shape # yields (5, 1, 6) 
print a[:, :, np.newaxis].shape # yields (5, 6, 1) 

Genellikle, bu, daha yüksek boyutlara yayın yapabilmek için şekilleri ayarlamak için kullanılır. Örneğin. orta ekseninde 7 kez döşeme

Ben Theano ile çalışmamış
b = a[:, np.newaxis] * np.ones((1, 7, 1)) 

print b.shape # yields (5, 7, 6), 7 copies of a along the second axis 
3

Theano vektörünün __getitem__ yönteminin bir bağımsız değişken olarak bir tuple beklediğini düşünüyorum! Böyle: Burada print a[0,2]

class Vect (object): 
    def __init__(self,data): 
     self.data=list(data) 

    def __getitem__(self,key): 
     return self.data[key[0]:key[1]+1] 

a=Vect('hello') 
print a[0,2] 

a istisna yükseltecektir sıradan bir listesi:

>>> a=list('hello') 
>>> a[0,2] 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: list indices must be integers, not tuple 

Ama burada __getitem__ yöntem farklıdır ve bir argüman olarak bir demet kabul eder.

class Vect (object): 
    def __init__(self,data): 
     self.data=list(data) 

    def __getitem__(self,key): 
     return self.data[0:key[1]+1]+list(key[0].indices(key[1])) 

a=Vect('hello') 
print a[:,2] 

yaklaşık None konuşan yanı düz Python dizine eklerken, bu kullanılabilir::

Sen : olarak böyle __getitem__ için : işareti geçebilir dilim demektir

>>> 'hello'[None:None] 
'hello' 
+0

Gerçekten de, sıradan bir listede bir [:, 3] 'yi çağırdığınızda, 'TypeError: liste indisleri tuple' değil tamsayı olmalıdır. Ancak, aslında burada tuple ne olduğunu görmüyorum. Biraz detaylandırır mısın? – Rishav

+0

tuple, virgül: P Yeah, bir tuple bir tuple yapan bir şey, paris değil, bir virgül olan asıl şey. Daha açık olmak isterseniz, muhtemelen bir [(:, 3)] yazabilirsiniz. – NightShadeQueen

+0

@NighShadeQueen wow Bunu asla tahmin edemezdim. – Rishav