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 中的正确模块匹配,然后插入这在所以相应的层=已经列出了尺寸的那个模块。

很明显,出了什么大问题,而且已经太远了,以至于我的大脑无法理解它……它失去了所有的理由,每次我看到它我都会害怕……请帮助我或告诉我我创造了一个可憎之类的东西,我猜...

4

1 回答 1

0

影响代码可读性的一大障碍是变量命名和样式。我试着为你清理一下。它仍然可能无法正常工作,但现在更容易看到发生了什么。请参考 PEP 8,Python 风格指南

对于初学者,我在下面重命名了一些变量。请注意,在 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)将 aTypeError作为 dict 引发的不是可调用对象。我假设您打算按键检索一个值。

正如我所说,我不太确定您在这里尝试做什么(可能是因为我还没有看到您的其余代码),但是重命名变量和使用良好的样式应该对您能够调试有很大帮助你的代码。如果您回答我的问题/评论,我将继续编辑。

于 2012-07-21T07:43:59.937 回答