我正在研究使用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
答案 0 :(得分:3)
有点晚了,但对某人可能有用:
将model.predict(X)
替换为model.predict(X, batch_size=len(X))
应该这样做。
答案 1 :(得分:1)
您是否在循环中运行Keras模型(使用TensorFlow后端)?如果是这样,Keras在此处发现内存泄漏问题:LINK
在这种情况下,您必须导入以下内容:
import keras.backend.tensorflow_backend
import tensorflow as tf
from keras.backend import clear_session
最后,在完成计算之后,必须在循环的每次迭代结束时添加以下内容:
clear_session()
if keras.backend.tensorflow_backend._SESSION:
tf.reset_default_graph()
keras.backend.tensorflow_backend._SESSION.close()
keras.backend.tensorflow_backend._SESSION = None
这可以帮助您在每个循环结束时释放内存,最终使进程更快。我希望这会有所帮助。
答案 2 :(得分:0)
memory leak issue似乎仍然存在于Keras中。该问题中提到的以下代码行对我有用:
import ... as K
import gc
model = ....
del model
K.clear_session()
gc.collect()