2017-09-08 2 views
0

Die Frage nach Array überschreiben mit h5py hat mein Problem nicht gelöst. Ich möchte die Array-Werte eines VGG16-Modells bearbeiten.Wie bearbeitet man h5-Dateien mit 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) 

Der obige Code liefert:

['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'] 

Nach diesem Code: print(f.attrs['layer_names'])

ich folgendes erhalten:

[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'] 

Wie kann ich die Werte zu ändern, die enthalten in der f.attrs['layer_names']? Ich kann sie hauptsächlich nicht bearbeiten, weil die Verwendung von: print(f.attrs['layer_names/block1_conv1']) einen Fehler zurückgibt.

In jedem Block (n) _conv (n) befindet sich eine Gewichtungs- und Bias-Matrix.

Ich möchte diese Werte ändern.

Ich mache das in Python 3, und keine Dokumentation half mir bei der Bearbeitung dieser Werte. Vor allem, weil ich nicht in der Lage bin diese diesen Code ohne Verwendung zuzugreifen:

layer = h5py.AttributeManager.get(f, key = str(layerstringlist[i])) 
nplayer = np.asarray(list(layer)) 

layerstringlist ist eine Liste dieser Art und Weise: Gibt es richtig

['block1_conv1/block1_conv1_W_1:0', 'block1_conv1/block1_conv1_b_1:0', ..... 
'predictions/predictions_W_1:0', 'predictions/predictions_b_1:0'] 

, aber ich bin nicht in der Lage die modifizierte h5-Datei zu speichern weil ich nicht weiß, wie man es in Python 3 referenziert.

Vielen Dank im Voraus!

+0

Kannst du nicht auf Dinge mit 'f.attrs ['layer_names] [0]', 'f.attrs [' layer_names] [1]' usw. zugreifen? – Evert

+0

Ich habe es versucht. f.attrs ['layer_names'] [0] [:] gibt b'block1_conv1 'zurück. Grundsätzlich ist es eine Liste, die mit [0] indiziert wird. Ich muss auf die Gruppe innerhalb von 'block1_conv1' zugreifen, damit ich diese Matrix verwenden und bearbeiten kann. Irgendwelche Tipps? – Mathbreaker

+0

Die Zeichenkette ist eine Bytefolge, also ja, Sie sehen den (ASCII) Wert des Zeichens an dieser Position (107 für 'c'). Aber das hilft Ihnen nicht, da es nur auf die Namen der Layer zugreift, nicht auf ihre Daten. – Evert

Antwort

0

Ich habe nicht die Verwendung von AttributeManager gesehen, vielleicht, weil die Dokumentation seiner Verwendung schreckt, http://docs.h5py.org/en/latest/high/attr.html#reference

Mit einer Datei von anderen SO Tests übrig erhalte ich:

In [480]: list(h5py.AttributeManager.keys(f)) 
Out[480]: ['agroup', 'agroup1', 'agroup2', 'arr'] 
In [481]: list(f.attrs.keys()) 
Out[481]: [] 
In [482]: list(f.keys()) 
Out[482]: ['agroup', 'agroup1', 'agroup2', 'arr'] 

In diesem Fall Ich habe der Datei keine Attribute zugewiesen, daher ist f.attrs.keys() leer. Es scheint, dass Ihre Datei ein Attribut hat, "layer_names". Sein Wert ist eine Liste von Namen, die Sie mit print(f.attrs['layer_names']) auflisten.

Die AttributeManager listet die Gruppen und Datasets auf, nicht die attrs. Ich bekomme die gleiche Liste mit f.keys().

sollten Sie Zugang eine dieser Gruppen oder Datensätze mit:

f['block1_conv1'] 

Wenn dies eine Gruppe, die Sie brauchen, ist Index nach unten eine andere Schicht. Wenn es sich um ein Dataset handelt, lesen und schreiben Sie es wie in http://docs.h5py.org/en/latest/high/dataset.html#reading-writing-data

beschrieben Ich glaube nicht, dass die f.attrs['layer_names'] Liste von Nutzen für Sie ist, da es die gleiche Information wie `list (f.keys()) hat .


Basierend auf Ihren Kommentar, f['block1_conv1'] ist eine Gruppe, mit mehreren Datensätzen enthält. Diese sind äquivalent Weisen Indexieren eines Satzes:

f['block1_conv1/block1_conv1_W_1:0'] 
f['block1_conv1']['block1_conv1_W_1:0'] 

In meiner Testdatei

In [483]: f['arr'] 
Out[483]: <HDF5 dataset "arr": shape (3,), type "|V31"> 

I den Datensatz in den Speicher als ein Array laden kann mit value oder [:]:

In [485]: f['arr'].value 
Out[485]: 
array([(123, 1, 1, 1, 1, 1, 1, 1), ( 1, 1, 1, 1, 1, 1, 1, 1), 
     ( 1, 1, 1, 1, 1, 1, 1, 1)], 
     dtype=[('Status', '<u8'), ('Segments', '<u4'), ('Characterized', '<u4'), ('More_Segments', '<u4'), ('ID', '<i4'), ('Releases', '<u2'), ('Type', 'u1'), ('Track', '<i4')]) 
In [486]: f['arr'][:] 
Out[486]: 
array([(123, 1, 1, 1, 1, 1, 1, 1), ( 1, 1, 1, 1, 1, 1, 1, 1), 
     ( 1, 1, 1, 1, 1, 1, 1, 1)], 
     dtype=[('Status', '<u8'), ('Segments', '<u4'), ('Characterized', '<u4'), ('More_Segments', '<u4'), ('ID', '<i4'), ('Releases', '<u2'), ('Type', 'u1'), ('Track', '<i4')]) 

(Entschuldigung, dieses Beispiel ist ein kompliziertes strukturiertes Array.)

kann ich die Werte dieses Datensatzes ändern, wie ich ein Array von der gleichen Art ändern würde und Form

In [487]: f['arr']['Status'] 
Out[487]: array([123, 1, 1], dtype=uint64) 
In [488]: f['arr']['Status'] = [1,2,3] 

ich es nicht ersetzen kann. f['arr'] = np.arange(10) gibt mir einen Fehler (Name existiert bereits). f['arr'][:] = np.arange(10) gibt einen anderen Fehler (über inkompatible Formen).

konnte ich einen neuen Datensatz mit einem anderen Namen

In [492]: f.create_dataset('newarray', np.arange(10)) 
Out[492]: <HDF5 dataset "newarray": shape (0, 1, 2, 3, 4, 5, 6, 7, 8, 9), type "<f4"> 
In [493]: list(f.keys()) 
Out[493]: ['agroup', 'agroup1', 'agroup2', 'arr', 'newarray'] 

erstelle ich einen Datensatz mit löschen:

In [494]: del f['newarray'] 
In [495]: list(f.keys()) 
Out[495]: ['agroup', 'agroup1', 'agroup2', 'arr'] 

und definieren eine neue mit demselben Namen mit:

In [500]: f.create_dataset('newarray', data=np.ones((3,4))) 
Out[500]: <HDF5 dataset "newarray": shape (3, 4), type "<f8"> 
+0

Das funktioniert. f ['block1_conv1/block1_conv1_W_1: 0'] gibt einen zurück, der bei Umwandlung in eine Liste die gewünschte Matrix liefert. Meine Frage ist, wie kann ich diese Matrix in ein anderes numpy Array ändern? (Ich möchte am Ende die Änderung an der h5-Datei vornehmen) Die Dokumentation hat die Dinge für mich kompliziert gemacht, also frage ich Sie direkt. Danke! – Mathbreaker

+0

Ich habe einige Beispiele für den Zugriff und die Änderung von Datensätzen hinzugefügt. – hpaulj

+0

Ich habe gesehen, was Sie gesagt haben, habe ich versucht: 'ersetzen = np.zeros (shape = np.asarray (liste (f ['block1_conv1/block1_conv1_W_1: 0'])).shape) ' ' f ['block1_conv1/block1_conv1_W_1: 0'] = ersetzen " Es gibt mir: Kann Link nicht erstellen (Name existiert bereits). Also ist die einzige Möglichkeit für mich, diese spezifische Referenz zu löschen und eine neue Referenz zu erstellen: 'f.create_dataset ('block1_conv1/block1_conv1_W_1: 0', ersetzen)' nach dem Löschen dieses HDF5-Objekts ja? – Mathbreaker

Verwandte Themen