2017-10-10 7 views
1

J'essaie de lire le poids et le biais dans un réseau de café avec de la pycaffe. Voici mon codeComment puis-je savoir si "bias" existe dans une couche?

weight = net.params[layer_name][0].data 
bias = net.params[layer_name][1].data 

Mais, certaines couches de mon réseau n'a pas de parti pris, de sorte qu'il y ait une erreur qui est Index out of range.

Donc ma question est peut-on utiliser

if(net.params[layer_name][1] exists): 
    bias = net.params[layer_name][1].data 

pour contrôler les affectations à bias? Et comment écrire le code?

Répondre

2

Vous pouvez simplement itérer sur net.params[layer_name]:

layer_params = [blob.data for blob in net.params[layer_name]] 

De cette façon, vous obtenez tous layer_params (qui pourrait être plus de 2 pour certaines couches, par exemple, "BatchNorm")

Si vous voulez seulement vérifier pour la deuxième blob de paramètres, vous pouvez utiliser len:

if len(net.params[layer_name]) >= 2: 
    bias = net.params[layer_name][1].data 

PS,
Il pourrait être le cas que net.params[layer_name] est pas exactement un python list, mais plutôt un objet wrapper boost python, vous pourriez donc avoir besoin de jeter explicitement à la liste (list(net.params[layer_name])) dans certaines des méthodes que je sugeré dans cette répondre.

+1

Merci beaucoup! Ça marche! Mais, en fait, c'est 'len (net.params [nom_couche])> = 2'. –

0

Si vous voulez le faire pour les couches de convolution, vous pouvez trouver si la couche a biais à travers la lecture du prototxt sans qu'il soit nécessaire pour le caffemodel, à savoir

from caffe.proto import caffe_pb2 
import google.protobuf.text_format 
net = caffe_pb2.NetParameter() 
f = open('model.prototxt', 'r') 
net = google.protobuf.text_format.Merge(str(f.read()), net) 
f.close() 
for i in range(0, len(net.layer)): 
    if net.layer[i].type == 'Convolution': 
     if net.layer[i].convolution_param.bias_term == True: 
      print 'layer has bias'