1

次の定義を持つライブラリ (カフェ) があります。

class NetSpec(object):
    def __init__(self):
        super(NetSpec, self).__setattr__('tops', OrderedDict())

    def __setattr__(self, name, value):
        self.tops[name] = value

    def __getattr__(self, name):
        return self.tops[name]

    def to_proto(self):
        names = {v: k for k, v in self.tops.iteritems()}
        autonames = {}
        layers = OrderedDict()
        for name, top in self.tops.iteritems():
            top.fn._to_proto(layers, names, autonames)
        net = caffe_pb2.NetParameter()
        net.layer.extend(layers.values())
        return net

を使用して呼び出そうとするとn = caffe.NetSpec()、次のエラーが発生します。

  File "../../python/caffe/layers.py", line 84, in __init__
    super(NetSpec, self).__setattr__('tops', OrderedDict())

TypeError: must be type, not None

SO-9698614SO- 576169 、SO -489269を確認しましたが、解決には至りませんでした。私のクラスは新しいタイプのクラスで、なぜ機能しないのかわかりませんでした。

完全なトレース:

Traceback (most recent call last):

  File "<ipython-input-72-694741de221d>", line 1, in <module>
    runfile('/home/shaunak/caffe-pr2086/examples/wine/classify.py', wdir='/home/shaunak/caffe-pr2086/examples/wine')

  File "/home/shaunak/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 682, in runfile
    execfile(filename, namespace)

  File "/home/shaunak/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 78, in execfile
    builtins.execfile(filename, *where)

  File "/home/shaunak/caffe-pr2086/examples/wine/classify.py", line 26, in <module>
    f.write(str(logreg('examples/hdf5_classification/data/train.txt', 10)))

  File "/home/shaunak/caffe-pr2086/examples/wine/classify.py", line 18, in logreg
    n = caffe.NetSpec()

  File "../../python/caffe/layers.py", line 84, in __init__
    super(NetSpec, self).__setattr__('tops', OrderedDict())

TypeError: must be type, not None
4

1 に答える 1

2

どういうわけかNetSpecNoneどこかにバインドできました:

>>> super(None, object())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be type, not None

このエラーは、NetSpecグローバルが にバインドされていることを示していNoneます。

インスタンス属性NetSpec.__setattr__に直接移動して、メソッドをバイパスすることもできます。__dict__

class NetSpec(object):
    def __init__(self):
       self.__dict__['tops'] = OrderedDict()

あなたが共有したコードから、これが原因である可能性があります:

from .layers import layers, params, NetSpec

これはインポートしますが、インスタンスにcaffe.layers再バインドします。これにより、モジュールへの他の参照がまだないため (参照がいつどのように作成されたかによって)、Python がモジュールを再度削除するようになり、すべてのグローバルが(を含む)に再バインドされる可能性がありますcaffe.layersLayers()sys.modulesNoneNetSpec

于 2015-04-21T14:25:49.673 に答える