0

そのため、私は Pybrain タイプのプロジェクトに取り組んでおり、その一部で立ち往生しています。vars()['string']これまでのところ、プログラムはタプルを受け取り、'one of them fancy statement ' を使用して変数をそれに割り当てています。具体的には、数字のタプルを受け取り、それを ' 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 つに 1 が含まれている場合に停止し、その演算子を Pybrain の適切なモジュールと一致させてからプラグインする必要がありました。これは、対応するレイヤー = 寸法が既にリストされているモジュールです。

明らかに何かがひどく間違っていて、私の脳がそれを理解することができないほど遠いです...理由がすべて失われ、それを見るたびに怖くなります...助けてください、または私が作成したことを教えてください嫌悪感か何か、私は推測します...

4

1 に答える 1

0

コードの可読性に影響を与える大きな障害の 1 つは、変数の命名とスタイルです。私はあなたのためにそれを少しきれいにしようとしました。それでもうまくいかないかもしれませんが、何が起こっているのかがずっと簡単にわかるようになりました。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

また、元々 、辞書として amodules_dict(moduleconbuff)を発生させるものTypeErrorは呼び出し可能なオブジェクトではありませんでした。キーで値を取得するつもりだったと思います。

私が言ったように、あなたがここで何をしようとしているのかよくわかりません (おそらくあなたのコードの残りの部分を見ていないためです)。あなたのコード。あなたが私の質問/コメントに答えれば、私は編集を続けます.

于 2012-07-21T07:43:59.937 に答える