我试图获取一个保存的模型,提取所有参数,然后使用标准操作在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相同。
非常感谢您!