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

标签 python multithreading tensorflow keras

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

尝试使用源线程中生成的 session 获取权重时 (mSess)

mModel.layers[1].weights[0].eval(session=mSess)

我得到错误:

FailedPreconditionError (see above for traceback): Error while reading resource variable dense/kernel from Container: localhost. This could mean that the variable was uninitialized. Not found: Container localhost does not exist. (Could not find resource: localhost/dense/kernel)

[[Node: dense/kernel/Read/ReadVariableOp = ReadVariableOpdtype=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]]

尝试使用新 session 和适当的图表返回层权重

sess = tf.Session(graph=mModel.output.graph)
sess.run(tf.global_variables_initializer())
mModel.layers[1].weights[0].eval(session=sess)

我得到错误:

ValueError: Fetch argument cannot be interpreted as a Tensor. (Operation name: "init" op: "NoOp" is not an element of this graph.)

最佳答案

错误“tensor is not an element of this graph”可以通过在模型中使用与张量关联的图来解决。

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()

原解

解决权重的问题是使用正确的图形和使用权重的初始化器而不是全局初始化器初始化 session 的组合。

sess = tf.Session(graph=mModel.output.graph)
weights = modelLayer.weights[0]
sess.run(weights.initializer)
weightsValues = weights.eval(session=sess)

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

关于python - 在单独的线程中从 Tensorflow 模型返回层激活和权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51753328/

相关文章:

Python 机会 : how to pass additional arguments to optimization routines

python - Python-如何正确终止threading.Timer类?

c - 不同的执行顺序导致Pthread程序性能的差异

android - 使用多线程绘制位图,在 Windows 和 Android 中结果不同

batch-file - CNN 上的快速损失收敛意味着什么?

javascript - 在 Node.js 中获取请求失败(客户端网络套接字在建立安全 TLS 连接之前断开)

javascript - 将 Javascript 生成的表上的 <td> 值抓取到 Python

python - 如何关闭aiohttp ClientSession

python - Tensorflow 数据集 API - 将窗口应用于多个序列

python - Odoo 更改宽度弹出窗口