在单独的线程中从 Tensorflow 模型返回层激活和权重



我正在尝试检索一个线程(使用 keras.models.model_from_jsonload_weights(加载的张量流模型(全局 mModel(的输出,并在网络服务器上的另一个线程中运行(使用 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)

我收到错误:

失败前提条件错误(有关回溯,请参见上文(:从容器:本地主机读取资源变量密集/内核时出错。这可能意味着变量未初始化。未找到:容器本地主机不存在。(找不到资源:本地主机/密集/内核(

[[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 参数不能被解释为张量。(操作名称:"初始化" 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)

这些解决方案跨线程工作。

最新更新