Воссоздание модели вне кераса с извлеченными параметрами? - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь взять сохраненную модель, вытащить все параметры и воссоздать ее вне керасов, используя стандартные операции.Я делаю это так, чтобы мне было легче делиться моделью (например, чтобы пользователю нужна была только база R для запуска обученной модели).

Проблема, с которой я сталкиваюсь, заключается в том, что при вычислении выходных данных для слоя с извлеченными параметрами появляется небольшое количество ошибок. Я не уверен, что является источником этой ошибки.

В дальнейшем сохраненная модель имеет 9 скрытых слоев, но я сосредоточусь на выводе 3-го слоя.Это полностью связанные слои, и это последовательная модель, которая в конечном итоге заканчивается двумя выходами.

Я использую один экземпляр в качестве входа.

Одно примечание: Слой пакетной нормализации немедленнопосле ввода.Однако я понимаю, что это не должно иметь значения, если, например, моя цель - получить выходные данные для третьего слоя с извлеченными выходными данными второго слоя (см. Пример).Я думаю, что это потому, что извлеченные активации являются функцией BN, реализованной керасом, а не вне керасы мной.

Я попытался использовать несколько разных примеров в качестве входных данных.Я попытался воссоздать модель в R и Python с извлеченными параметрами.Ни один не помог.

Я подозреваю, что, возможно, есть какая-то проблема, связанная с float64 и float32 - я еще не исключил это (и был бы признателен за любые советы о том, как это сделать!).

import numpy as np
from keras.models import model_from_json
from keras import backend as K

#  Load saved model
json_file = open('trainedModel.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)

#  Load saved weights
loaded_model.load_weights("trainedModel.h5")

#  Compile the trained model, using same arguments as when it was trained
loaded_model.compile(loss={'Delta': 'mean_absolute_error', 'Tau': 'mean_absolute_error'}, optimizer='Adagrad', loss_weights=[2, 1])

#  Get parameters for the third layer
w3 = loaded_model.layers[3].get_weights()[0]
b3 = loaded_model.layers[3].get_weights()[1]

#  Get the output for the third layer (as described in keras FAQ)
get_3rd_layer_output = K.function([loaded_model.layers[0].input, K.learning_phase()],
                                  [loaded_model.layers[3].output])
a4 = get_3rd_layer_output([X, 0])[0]

#  Try to calculate the output for the third layer with the parameters and the output from layer 2
a4_recalculated = np.tanh(np.matmul(a3,w3)+b3)

#  Look at the difference
print(np.mean(a4 - a4_recalculated ))     #extremely small, e.g., -7.1603186e-09
print(np.corrcoef(a4, a4_recalculated ))  #perfectly correlated, i.e., r = 1.00

Я ожидаю, что a4 и a4_recalculated будут одинаковыми.

Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...