我试图从一个线程中加载的张量流模型(global mModel)中检索输出(使用keras.models.model_from_json和load_weights)并在网络服务器上运行(使用预测)另一个线程。如何提供隐藏图层的输出和网络权重?
在通过创建如下模型来预测中间层模型的一些尝试中,我得到了一个错误,包括“张量不是该图的元素”。
for modelLayer in mModel.layers:
if not modelLayer.output == mModel.input:
intermediateModel = keras.models.Model(inputs=mModel.input, outputs=modelLayer.output)
layerActivations = intermediateModel.predict(np.array([inputs]))[0]
尝试使用原始线程中生成的会话获取权重时(mSess)
mModel.layers[1].weights[0].eval(session=mSess)
我收到错误:
FailedPreconditionError(参见上面的回溯):从Container:localhost读取资源变量密集/内核时出错。这可能意味着该变量未初始化。未找到:Container localhost不存在。 (找不到资源:localhost / dense / kernel)
[[Node:dense / kernel / Read / ReadVariableOp = ReadVariableOpdtype = DT_FLOAT,_device =“/ job:localhost / replica:0 / task:0 / device:CPU:0”]]
尝试使用新会话和相应的图表返回图层权重
sess = tf.Session(graph=mModel.output.graph)
sess.run(tf.global_variables_initializer())
mModel.layers[1].weights[0].eval(session=sess)
我收到错误:
ValueError:Fetch参数不能解释为Tensor。 (操作名称:“init”op:“NoOp”不是此图的元素。)
可以通过使用与模型中的张量相关联的图来解决错误“张量不是该图的元素”。
with mModel.output.graph.as_default():
for modelLayer in mModel.layers:
if not modelLayer.output == mModel.input:
intermediateModel = keras.models.Model(inputs=mModel.input, outputs=modelLayer.output)
layerActivations = intermediateModel.predict(np.array([inputs]))[0]
编辑:更新解决方案
虽然下面的原始解决方案修复了报告的问题,但使用... eval(sess)为权重提供的值是初始化值,而不是学习值或预测使用的值。可能有一种方法可以使用eval来获得正确的结果,但我不知道它。我找到的替代解决方案是在模型或图层上使用get_weights(),如:
mModel.get_weights()
mModel.layers[1].get_weights()
原始解决方案
解决权重的问题是使用正确的图形并使用权重的初始化程序而不是全局初始化程序初始化会话的组合。
sess = tf.Session(graph=mModel.output.graph)
weights = modelLayer.weights[0]
sess.run(weights.initializer)
weightsValues = weights.eval(session=sess)
这些解决方案跨线程工作。