Python Keras/Tensorflow:高效获取所有层的预测或输出

Python Keras/Tensorflow:高效获取所有层的预测或输出,python,tensorflow,keras,output,layer,Python,Tensorflow,Keras,Output,Layer,我能够获得中建议的所有层的输出/预测 但是对于大约50层的模型来说,这是难以置信的慢,并且需要超过一分钟的时间(在6700HQ和GTX1070中,时间为~65s,高得离谱,推理在不到一秒的时间内发生…!)。我猜这是因为它每次都在构建一个模型,将模型加载到内存中,传递输入并获得输出。显然,如果不从其他层获得结果,就无法获得最后一层的输出,我如何像上面那样保存它们,而不必创建冗余模型(或以更快、更高效的方式) 更新:我还注意到这没有利用我的GPU,这意味着所有的conv层都是由CPU执行的?为什么不

我能够获得中建议的所有层的输出/预测

但是对于大约50层的模型来说,这是难以置信的慢,并且需要超过一分钟的时间(在
6700HQ
GTX1070
中,时间为~65s,高得离谱,推理在不到一秒的时间内发生…!)。我猜这是因为它每次都在构建一个模型,将模型加载到内存中,传递输入并获得输出。显然,如果不从其他层获得结果,就无法获得最后一层的输出,我如何像上面那样保存它们,而不必创建冗余模型(或以更快、更高效的方式)

更新:我还注意到这没有利用我的GPU,这意味着所有的conv层都是由CPU执行的?为什么不用我的GPU呢?我想如果用我的GPU的话会少花点时间


如何更有效地执行此操作?

根据Ben Usman的建议,您可以首先将模型封装在基本的端到端
模型中,并将其层作为输出提供给第二个
模型:

import keras.backend as K
from keras.models import Model
from keras.layers import Input, Dense

input_layer = Input((10,))

layer_1 = Dense(10)(input_layer)
layer_2 = Dense(20)(layer_1)
layer_3 = Dense(5)(layer_2)

output_layer = Dense(1)(layer_3)

basic_model = Model(inputs=input_layer, outputs=output_layer)

# some random input
import numpy as np
features = np.random.rand(100,10)

# With a second Model
intermediate_model = Model(inputs=basic_model.layers[0].input, 
                              outputs=[l.output for l in basic_model.layers[1:]])
intermediate_model.predict(features) # outputs a list of 4 arrays
或者,您可以以类似的方式使用Keras函数:

# With a Keras function
get_all_layer_outputs = K.function([basic_model.layers[0].input],
                                  [l.output for l in basic_model.layers[1:]])

layer_output = get_all_layer_outputs([features]) # return the same thing

我没有专门与keras合作,但从一般tensorflow的角度来看,如何计算单个
中间层的输出(inputs=model.input,outputs=[layer.output for layer in model.layers[1:])
?问题中的代码:
65s
,中间层模型(一个模型,所有层作为输出):
1.21s
,Keras函数:
0.06s
->这就是我想要的:)很好!有趣的是,Keras函数的性能如此之好!为什么它工作得那么快?keras函数背后有什么魔力吗?如何将layer_输出嵌入进一步应用于keras模型?
# With a Keras function
get_all_layer_outputs = K.function([basic_model.layers[0].input],
                                  [l.output for l in basic_model.layers[1:]])

layer_output = get_all_layer_outputs([features]) # return the same thing