为什么TF Keras推理比Numpy运算慢?

ale*_*der 10 python numpy keras tensorflow

我正在使用Keras和Tensorflow实施强化学习模型。我必须在单个输入上频繁调用model.predict()。

在对简单的预训练模型进行推理测试时,我注意到使用Keras的model.predict比仅对存储的权重使用Numpy慢。为什么这么慢,我如何加速呢?对于复杂模型,使用纯Numpy不可行。

import timeit
import numpy as np
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense

w = np.array([[-1., 1., 0., 0.], [0., 0., -1., 1.]]).T
b = np.array([ 15., -15., -21., 21.])

model = Sequential()
model.add(Dense(4, input_dim=2, activation='linear'))
model.layers[0].set_weights([w.T, b])
model.compile(loss='mse', optimizer='adam')

state = np.array([-23.5, 17.8])

def predict_very_slow():
    return model.predict(state[np.newaxis])[0]

def predict_slow():
    ws = model.layers[0].get_weights()
    return np.matmul(ws[0].T, state) + ws[1]

def predict_fast():
    return np.matmul(w, state) + b

print(
    timeit.timeit(predict_very_slow, number=10000),
    timeit.timeit(predict_slow, number=10000),
    timeit.timeit(predict_fast, number=10000)
)
# 5.168972805004538 1.6963867129435828 0.021918574168087623
# 5.461319456664639 1.5491559107269515 0.021502970783442876
Run Code Online (Sandbox Code Playgroud)

小智 11

有点晚了,但可能对某人有用:

替换model.predict(X)model.predict(X, batch_size=len(X))

那应该这样做。


tro*_*e00 4

您是否在循环中运行 Keras 模型(带有 TensorFlow 后端)?如果是这样,则 Keras 存在内存泄漏问题,如下所示:LINK

在这种情况下,您必须导入以下内容:

import keras.backend.tensorflow_backend
import tensorflow as tf

from keras.backend import clear_session
Run Code Online (Sandbox Code Playgroud)

最后,完成计算后,您必须在循环的每次迭代结束时添加以下内容:

clear_session()
if keras.backend.tensorflow_backend._SESSION:
    tf.reset_default_graph()
    keras.backend.tensorflow_backend._SESSION.close()
    keras.backend.tensorflow_backend._SESSION = None
Run Code Online (Sandbox Code Playgroud)

这应该可以帮助您在每个循环结束时释放内存,并最终使过程更快。我希望这有帮助。