I'm using Keras and Tensorflow to train a neural.network. Via the early stopping callback I am saving hdf5 files containing weights and biases:
file_path = "data/weights-improvement-{epoch:02d}-{val_loss:.2f}.hdf5"
save_best_callback = ModelCheckpoint(file_path, monitor='val_loss', verbose=1, save_best_only=True,
save_weights_only=False, mode='auto', period=1)
# model
visible = Input(shape=(36,))
x = Dense(40, activation='tanh')(visible)
x = Dense(45, activation='tanh')(x)
x = Dense(30, activation='tanh')(x)
x = Dense(55, activation='tanh')(x)
output = Dense(5, activation='tanh')(x)
Normally, I use
weights_1 = model.layers[1].get_weights()[0]
biases_1 = model.layers[1].get_weights()[1]
for one layer.
Somehow, the weights and biases could not be saved when I ran my script overnight (which is unusual, a hdf5 file failed to create). Now I have multiple hdf5 files left from which I want to choose the last one that could be saved to load my weights and biases.
I want the weight matrix of each layer to have the form (#cells x #inputs) and the bias matrix to have the form (#cells x 1), while for layer j=1 #inputs = 36 and for j>1 inputs = #cells(j-1). Then those matrices should be stored as numpy arrays.
In total I have 5 layers, which should give me 5 weight and bias matrices. I tried loading a hdf5-file with pandas:
import numpy as np
import pandas as pd
array = np.fromfile('data/weights-improvement-446-0.00.hdf5', dtype=float)
df_array = pd.DataFrame(array)
print(df_array)
but this just gives me a dataframe consisting of 1 column and m rows, where some elements are 'NaN'. Can anyone help me? Thanks in advance.
Why not use keras load_model API? If it's only the weights, use the load_weights API.
>>> from keras.models import load_model
>>> model = load_model('data/weights-improvement-446-0.00.hdf5')
>>> for layer in model.layers:
>>> if len(layer.weights) > 0:
>>> print(layer.name, layer.weights[0].shape)
Function to read saved Keras (tensorflow) weights from hdf5 file:
import os
import h5py
import numpy as np
def print_model_h5_wegiths(weight_file_path):
# weights tensor is stored in the value of the Dataset, and each episode will have attrs to store the attributes of each network layer
f = h5py.File(weight_file_path) # read weights h5 file and return File class
try:
if len(f.attrs.items()):
print("{} contains: ".format(f.filename)) # weight_file_path
print("Root attributes:")
for key, value in f.attrs.items():
print(" {}: {}".format(key, value))
# Output the attrs information stored in the File class, generally the name of each layer: layer_names/backend/keras_version
for layer, g in f.items():
# Read the name of each layer and the Group class containing layer information
print(" {} with Group: {}".format(layer, g)) # model_weights with Group: <HDF5 (22 members)>),
print(" Attributes:")
for key, value in g.attrs.items():
# Output the attrs information stored in the Group class, generally the weights and biases of each layer and their names
# eg ;weight_names: [b'attention_2/q_kernel:0' b'attention_2/k_kernel:0' b'attention_2/w_kernel:0']
print(" {}: {}".format(key, value))
#
print(" Dataset:") # np.array(f.get(key)).shape()
for name, d in g.items(): # Read the Dataset class that stores specific information in each layer
print('name:', name, d)
if str(f.filename).endswith('.weights'):
for k, v in d.items():
# Output the layer name and weight stored in the Dataset, or print the attrs of the dataset
# k, v embeddings:0 <HDF5 dataset "embeddings:0": shape (21, 128), type "<f4">
print(' {} with shape: {} or {}'.format(k, np.array(d.get(k)).shape, np.array(v).shape))
print(" {} have weights: {}".format(k, np.array(v))) # Weights of each layer
print(str(k))
if str(f.filename).endswith('.h5'):
for k, v in d.items(): # v is equivalent to d.get(k)
print(k, v)
print(' {} with shape: {} or {}'.format(k, np.array(d.get(k)).shape, np.array(v).shape))
print(" {} have weights: {}".format(k, np.array(v))) # Weights of each layer
print(str(k))
# Adam <HDF5 group "/optimizer_weights/training/Adam" (63 members)>
finally:
f.close()
print('Current working path:', os.getcwd())
h5_weight = r'modelx.h5'
print_model_h5_wegiths(h5_weight)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.