Я пытаюсь взять сохраненную модель, вытащить все параметры и воссоздать ее вне керасов, используя стандартные операции.Я делаю это так, чтобы мне было легче делиться моделью (например, чтобы пользователю нужна была только база 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 будут одинаковыми.
Большое спасибо!