La question sur le tableau d'écrasement utilisant h5py n'a pas résolu mon problème. Je souhaite modifier les valeurs de tableau d'un modèle VGG16.Comment modifier les fichiers h5 avec h5py?
f = h5py.File('C:/Users/yash/.keras/models/vgg16_weights_tf_dim_ordering_tf_kernels_2.h5', mode = 'a')
ab = list(h5py.AttributeManager.keys(f))
print(list(f.attrs.keys()))
print(ab)
Le code ci-dessus retours:
['layer_names']
['block1_conv1', 'block1_conv2', 'block1_pool', 'block2_conv1', 'block2_conv2', 'block2_pool', 'block3_conv1', 'block3_conv2', 'block3_conv3',
'block3_pool', 'block4_conv1', 'block4_conv2', 'block4_conv3', 'block4_pool',
'block5_conv1', 'block5_conv2', 'block5_conv3', 'block5_pool', 'fc1', 'fc2',
'flatten', 'predictions']
Après avoir utilisé ce code: print(f.attrs['layer_names'])
Je reçois le texte suivant:
[b'block1_conv1' b'block1_conv2' b'block1_pool' b'block2_conv1'
b'block2_conv2' b'block2_pool' b'block3_conv1' b'block3_conv2'
b'block3_conv3' b'block3_pool' b'block4_conv1' b'block4_conv2'
b'block4_conv3' b'block4_pool' b'block5_conv1' b'block5_conv2'
b'block5_conv3' b'block5_pool' b'flatten' b'fc1' b'fc2' b'predictions']
Comment puis-je modifier les valeurs qui sont contenu dans le f.attrs['layer_names']
? Je ne suis pas en mesure de les éditer principalement parce que l'utilisation: print(f.attrs['layer_names/block1_conv1'])
renvoie une erreur.
Il existe une matrice de pondération et de polarisation à l'intérieur de chaque bloc (n) _conv (n).
Je veux changer ces valeurs. Je le fais en python 3, et aucune documentation ne m'a aidé à éditer ces valeurs. La plupart du temps parce que je ne peux pas y accéder sans utiliser ce code:
layer = h5py.AttributeManager.get(f, key = str(layerstringlist[i]))
nplayer = np.asarray(list(layer))
layerstringlist
est une liste de cette manière:
['block1_conv1/block1_conv1_W_1:0', 'block1_conv1/block1_conv1_b_1:0', .....
'predictions/predictions_W_1:0', 'predictions/predictions_b_1:0']
Cela renvoie correctement, mais je ne peux pas enregistrer le fichier h5 modifié parce que je ne sais pas comment le référencer en python 3.
Merci d'avance!
Vous ne pouvez pas accéder aux choses avec 'f.attrs ['layer_names'] [0]', 'f.attrs ['layer_names'] [1]' etc? – Evert
Je l'ai essayé. f.attrs ['layer_names'] [0] [:] renvoie b'block1_conv1 '. Fondamentalement, c'est une liste, qui est indexée en utilisant le [0]. J'ai besoin d'accéder au groupe à l'intérieur de 'block1_conv1' pour pouvoir utiliser cette matrice et l'éditer. Des conseils? – Mathbreaker
La chaîne est une séquence d'octets donc oui, vous voyez la valeur (ASCII) du caractère à cette position (107 pour 'c'). Mais en effet, cela ne vous aide pas, car il accède uniquement aux noms des couches, pas à leurs données. – Evert