2016-09-29 1 views
1

J'utilise Lasagne + Theano pour créer un ResNet et je suis aux prises avec l'utilisation de DenseLayer. Si j'utilise l'exemple sur http://lasagne.readthedocs.io/en/latest/modules/layers/dense.html cela fonctionne.lasagne.layers.DenseLayer: "__init __() prend au moins 3 arguments"

l_in = InputLayer((100, 20)) 
l1 = DenseLayer(l_in, num_units=50) 

Mais si je veux l'utiliser dans mon projet:

#other layers 

resnet['res5c_branch2c'] = ConvLayer(resnet['res5c_branch2b'], num_filters=2048, filter_size=1, pad=0, flip_filters=False) 
resnet['pool5'] = PoolLayer(resnet['res5c'], pool_size=7, stride=1, mode='average_exc_pad', ignore_border=False) 
resnet['fc1000'] = DenseLayer(resnet['pool5'], num_filter=1000) 

Traceback (most recent call last):File "convert_resnet_101_caffe.py", line 167, in <module> 
resnet['fc1000'] = DenseLayer(resnet['pool5'], num_filter=1000)TypeError: __init__() takes at least 3 arguments (2 given) 

Répondre

1

DenseLayer prend deux arguments de position: incoming, num_units. Vous instanciation comme ceci:

DenseLayer(resnet['pool5'], num_filter=1000) 

Notez que ceci est différent du code exemple:

DenseLayer(l_in, num_units=50) 

Puisque vous passez un argument de mot-clé qui est pasnum_units comme second argument, je pense num_filter est interprété comme l'un des **kwargs, et DenseLayer is still wanting that argument num_units`, et en soulevant une erreur puisque vous ne le fournissez pas.

Vous pouvez fournir un argument num_units avant num_filter, ou si cela était juste une faute de frappe, changer num_filter à num_units. (La deuxième option semble plus probable pour moi puisque, même si je ne connais pas la bibliothèque que vous utilisez, je ne vois aucune référence à num_filter dans la documentation que vous avez liée, bien que certaines classes semblent prendre un num_filters - notez la fin s - argument.)

+1

Merci, je ne l'ai pas vu :) c'était une faute de frappe – TobSta