Keras/Tensorflow: 高效获取所有层的预测或输出
Keras/Tensorflow: Get predictions or output of all layers efficiently
我能够按照 Keras Docs: how-can-i-obtain-the-output-of-an-intermediate-layer
中的建议获得所有图层的 output/predictions
def get_output_of_all_layers(model, test_input):
output_of_all_layers = []
for count, layer in enumerate(model.layers):
# skip the input layer
if count == 0:
continue
intermediate_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer.name).output)
intermediate_output = intermediate_layer_model.predict(test_input)[0]
output_of_all_layers.append(intermediate_output)
return np.array(output_of_all_layers)
但这慢得令人难以置信,并且需要一分钟多的时间(时钟为 ~65s,在 6700HQ
和 GTX1070
中,这高得离谱,推断对于大约 50 层的模型,不到一秒钟就会发生...!)。我猜这是因为它每次都在构建模型,将模型加载到内存中,传递输入并获取输出。显然,如果不从其他层获得结果,就无法获得最后一层的输出,我如何像上面那样保存它们而不必创建冗余模型(或以更快、更有效的方式)?
更新:我还注意到这没有使用我的 GPU,这意味着所有的卷积层都由 CPU?为什么它不为此使用我的 GPU?我想如果它使用我的 GPU,它会占用更少的时间。
如何更有效地做到这一点?
正如 Ben Usman 所建议的,您可以先将模型包装在一个基本的端到端 Model
中,然后将其层作为输出提供给第二个 Model
:
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 Docs: how-can-i-obtain-the-output-of-an-intermediate-layer
中的建议获得所有图层的 output/predictionsdef get_output_of_all_layers(model, test_input):
output_of_all_layers = []
for count, layer in enumerate(model.layers):
# skip the input layer
if count == 0:
continue
intermediate_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer.name).output)
intermediate_output = intermediate_layer_model.predict(test_input)[0]
output_of_all_layers.append(intermediate_output)
return np.array(output_of_all_layers)
但这慢得令人难以置信,并且需要一分钟多的时间(时钟为 ~65s,在 6700HQ
和 GTX1070
中,这高得离谱,推断对于大约 50 层的模型,不到一秒钟就会发生...!)。我猜这是因为它每次都在构建模型,将模型加载到内存中,传递输入并获取输出。显然,如果不从其他层获得结果,就无法获得最后一层的输出,我如何像上面那样保存它们而不必创建冗余模型(或以更快、更有效的方式)?
更新:我还注意到这没有使用我的 GPU,这意味着所有的卷积层都由 CPU?为什么它不为此使用我的 GPU?我想如果它使用我的 GPU,它会占用更少的时间。
如何更有效地做到这一点?
正如 Ben Usman 所建议的,您可以先将模型包装在一个基本的端到端 Model
中,然后将其层作为输出提供给第二个 Model
:
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