веса и уклоны из файла hdf5 - PullRequest
1 голос
/ 14 марта 2019

Я использую Keras и Tensorflow для обучения нейронной сети.С помощью функции обратного вызова с ранней остановкой я сохраняю файлы hdf5, содержащие веса и смещения:

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)

Обычно я использую

weights_1 = model.layers[1].get_weights()[0]
biases_1 = model.layers[1].get_weights()[1]

для одного слоя.

Почему-тоВеса и смещения не могли быть сохранены, когда я запустил свой скрипт на ночь (что необычно, файл hdf5 не удалось создать).Теперь у меня осталось несколько файлов hdf5, из которых я хочу выбрать последний, который можно сохранить для загрузки моих весов и смещений.

Я хочу, чтобы матрица весов каждого слоя имела форму (#cells x #входы) и матрица смещения должна иметь форму (#cells x 1), тогда как для слоя j = 1 #inputs = 36 и для j> 1 входов = #cells (j-1).Затем эти матрицы должны храниться в виде пустых массивов.

Всего у меня есть 5 слоев, что должно дать мне 5 матриц веса и смещения.Я попытался загрузить hdf5-файл с помощью 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)

, но это просто дает мне фрейм данных, состоящий из 1 столбца и m строк, где некоторые элементы имеют значение «NaN».Может кто-нибудь мне помочь?Заранее спасибо.

1 Ответ

2 голосов
/ 14 марта 2019

Почему бы не использовать keras load_model API?Если это только вес, используйте API load_weights.

>>> 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)
...