使用提取的参数在keras之外重建模型?

时间:2019-04-17 20:38:45

标签: keras deep-learning

我试图获取一个保存的模型,提取所有参数,然后使用标准操作在keras外部重新创建它。我这样做是为了使模型更易于共享(例如,使用户只需要基数R即可运行经过训练的模型)。

我遇到的问题是,当我使用提取的参数计算图层的输出时,会出现少量错误。我不确定此错误的根源是什么。

在下面,保存的模型具有9个隐藏层,但我主要关注第3层的输出。这些是完全连接的层,它是一个顺序模型,最终以两个输出终止。

我正在使用一个实例作为输入。

一个注意事项:输入之后立即有一个批处理规范化层。但是,我的理解是,例如,如果我的目标是使用第二层的提取输出来获取第三层的输出,则无关紧要(请参见示例)。我认为这是因为提取的激活是keras实现的BN的功能,而不是我在keras之外。

我尝试使用几个不同的示例实例作为输入。我尝试使用提取的参数在R和Python中重新创建模型。两者都没有帮助。

我怀疑可能有一些与float64 vs 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相同。

非常感谢您!

0 个答案:

没有答案