我正在尝试从使用一个线程( keras.models.model_from_json 和 load_weights )加载的一个张量流模型(全局 mModel )中检索输出em>),然后在另一个Web服务器上运行(使用 predict )。我还如何提供隐藏层和网络权重的输出?
在通过如下创建模型来预测中间层模型的一些尝试中,我遇到了一个错误,包括“张量不是该图的元素”。
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读取资源变量密集/内核时出错。这可能意味着该变量未初始化。找不到:容器localhost不存在。 (找不到资源:localhost / dense / kernel)
[[节点:密集/内核/ Read / ReadVariableOp = ReadVariableOpdtype = DT_FLOAT,_device =“ / job:localhost /副本: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:提取参数不能解释为张量。 (操作名称:“ init” op:“ NoOp”不是此图的元素。)
答案 0 :(得分:1)
可以通过使用与模型中的张量关联的图来解决错误“张量不是该图的元素”。
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)
这些解决方案跨线程工作。