2012-07-21 16 views
0

所以,我正在研究一個Pybrain類型的項目,並且我被卡住了一部分。 到目前爲止,程序需要一個元組並使用'其中一個花式的vars()['string']語句爲其分配變量。具體而言,它需要在數量的元組並將其分配給一個「layerx」值,其中x是層的數量(按順序,層1,2,3,等),使得所述數字是該尺寸層。將元組中的二元運算符匹配到字典項目

程序我拼命謙卑地來找你幫助的部分是什麼,應在程序中的下一個步驟;它需要一個元組的元組(元組的數量必須=層數),並且元組包含1/0。

它應該確定在哪一層使用什麼類型的Pybrain層,然後塞在該層的尺寸值,從本質上講,創建層變量。我已經玩了一段時間了,而且我已經變得......扭曲......令人困惑的代碼塊。

請原諒令人費解的變量名,我以爲我是通過讓他們有些具體聰明:

moduleconbuff = 0 
    modulebuffer = 'module' 
    correspondinglayerbuff = 0 
    moduleconfigcopy = tuple(moduleconfig) 

    try: #Always triggers except, but it's pretty screwed up 
       while correspondinglayerbuff <= len(self.layers):  #keeps track of how many layer/module pairs have been assigned 
        for elm in moduleconfigcopy: 
         for x in elm: 
          if x == 1: 
           moduledimmension = [layerbuff+'%s'%(correspondinglayerbuff)] 
           modulesdict = {1: pybrain.GaussianLayer(moduledimmension), 2: pybrain.LinearLayer(moduledimmension),\ 
           3: pybrain.LSTMLayer(moduledimmension),4: pybrain.SigmoidLayer(moduledimmension),5: pybrain.TanhLayer(moduledimmension)} #this dict pairs integers with pybrain modules 
           vars()[modulebuffer +'%s'%(correspondinglayerbuff)]=modulesdict(moduleconbuff) #should return something like 'Module1 = pybrain.GaussianLayer(5) when complete 
           print vars()[modulebuffer+'%s'%(correspondinglayerbuff)] 
           moduleconbuff=0 
           correspondinglayerbuff+=1 
           print 'Valid: ', moduleconfigcopy, elm 
           continue 
          else: 
           elm = elm[1:] 
           print 'Invalid: ', moduleconfigcopy, elm 
           moduleconbuff+=1 
    except: 
     print 'Invalid!!!' 

老實說,我記不清在它發生了什麼事的。在開始 元組「moduleconfig」被認爲是元組(嵌套元組)與二元運算符的元組,它應該停止時的元組中的一個具有如圖1所示,該操作員與在Pybrain正確的模塊匹配,並且然後將其插入,以便相應的層=已列出dimmensions的模塊。

很明顯,有些事情發生了非常嚴重的錯誤,而且我的大腦無法理解它,這已經太遙遠了......它失去了所有的理由,每次看到它,我都會害怕......請幫助我或告訴我,我創建了一個憎惡什麼,我猜...

+0

快速提示:使用'except'來捕獲特定的異常(例如'NameError'或'TypeError'。嘗試將try塊中的代碼量減至最少,以避免錯誤發生。並且只捕捉你可以處理的錯誤。看起來你的'try..except'塊沒有做這些事情。做這樣的事情將有助於「我忘記了正在發生的事情」部分代碼。 – 2012-07-21 07:06:21

+0

我只是使用try ... except塊作爲臨時調試點,直到我可以計算出代碼並轉到具體信息....指出,儘管 – 2012-07-21 07:08:35

+0

裸體除了不會幫助您調試,因爲它減少了,而不是更多的信息。例如,而不是「IndexError」(和錯誤的特定行),現在你只是得到一個模棱兩可的「無效!!」打印到標準輸出。 – 2012-07-21 07:09:58

回答

0

一個多數民衆贊成影響代碼的可讀性,對你來說是變量的命名和風格的巨大障礙。我試圖爲你清理它一點點。它仍然可能不起作用,但現在很容易看到發生了什麼。請參考PEP 8,Python style guide

對於初學者來說,我改名一些變量,如下。請注意,在python中,變量應該全部小寫,並用單獨的單詞連接下劃線。常量應該ALL_UPPERCASE:

assigned_layers = correspondinglayerbuff = 0 
tuple_of_tuples = moduleconfigcopy = ((0, 1), (0, 0, 1), (0, 1)) 
dimension = moduledimension 
MOD_BUFFER = modulebuffer = 'buffer' 
c_buff = moduleconbuff = 0 

這裏是while循環(帶有可變名稱進行替換,並妥善縮進,與try... except分塊切除:

while assigned_layers <= len(self.layers): 
    for element_tuple in tuple_of_tuples: 
     for item in element_tuple: 
      if item: # in python, 0 is treated as boolean False, 1 or any other value is treated as boolean True. 
       dimension = [layerbuff + str(assigned_layers)] #what is layerbuff? 
       modules_dict = { 
        1: pybrain.GaussianLayer(dimension), 
        2: pybrain.LinearLayer(dimension), 
        3: pybrain.LSTMLayer(dimension), 
        4: pybrain.SigmoidLayer(dimension), 
        5: pybrain.TanhLayer(dimension) 
        } # Notice how this dict is much easier to read. 

       vars()[MOD_BUFFER + str(assigned_layers)] = modules_dict[c_buff] #modules_dict is a dict and not a callable object 
       c_buff = 0 
       assigned_layers +=1 
       #No need for continue here, since that's what the if...else does here. 
      else: 
       element_tuple = element_tuple[1:] #what is this for? 
       print 'Invalid: ', tuple_of_tuples, element_tuple 

我不知道你是什麼試圖在這一行做:

vars()[MOD_BUFFER + str(assigned_layers)] = modules_dict[c_buff] #modules_dict is a dict and not a callable object 

而且,你原來有modules_dict(moduleconbuff)這將提高一個TypeError的字典是不是可調用的對象,我一個假設你打算通過密鑰來檢索一個值。

正如我所說的,我不太清楚你想在這裏做什麼(可能是因爲我沒有看到你的代碼的其餘部分),但重命名你的變量和使用良好的風格應該對你很長的路要走能夠調試你的代碼。如果你回答我的問題/評論,我會繼續編輯。

+0

謝謝,我會插入它,看看它的工作原理,我猜?至於字典的奇怪設置,我使用的編輯器(Pydev for Eclipse)決定,無論出於何種原因,該特定設置都會引起錯誤,儘管我使用的是完全相同的設置.... – 2012-07-21 07:47:50

+0

@AaronSnipsTp:I只是意味着這是一個起點。我懷疑上面的代碼會「按原樣」工作。它比您發佈的代碼更容易調試。我必須知道這段代碼是如何與你的類的其他部分進行交互的,以便寫出「有用」的東西。 – 2012-07-21 07:51:09

+0

注意到了,但它看起來......現在很多更清潔,所以這是一些工作,謝謝! – 2012-07-21 07:54:39