Python 张量流模型预测速度较慢

Python 张量流模型预测速度较慢,python,performance,numpy,tensorflow,keras,Python,Performance,Numpy,Tensorflow,Keras,我有一个TensorFlow模型,其中有一个密集的层: model=tf.keras.Sequential([tf.keras.layers.density(2)]) build(输入_shape=(无,无,25)) 我在float32中构造一个输入向量: np_vec=np.array(np.random.randn(1,1,25),dtype=np.float32) vec=tf.cast(tf.convert_to_tensor(np_-vec),dtype=tf.float32) 我

我有一个
TensorFlow
模型,其中有一个
密集的
层:

model=tf.keras.Sequential([tf.keras.layers.density(2)])
build(输入_shape=(无,无,25))
我在
float32
中构造一个输入向量:

np_vec=np.array(np.random.randn(1,1,25),dtype=np.float32)
vec=tf.cast(tf.convert_to_tensor(np_-vec),dtype=tf.float32)
我想把它输入到我的模型中进行预测,但速度非常慢。 如果我调用
predict
\uuuu调用\uuuu
,与在NumPy中执行相同的操作相比,这需要很长的时间

  • 调用
    %timeit模型。预测(vec)
    : 10个回路,最佳3个:每个回路21.9毫秒

  • 按原样调用模型
    %timeit模型(vec,training=False)
    : 1000个回路,最好为3:806µs/回路

  • 自己执行乘法运算
    weights=np.array(model.layers[0]。获取权重()[0])
    %timeit np_vec@重量
    
    1000000个回路,最好为3个:每个回路1.27µs

  • 使用torch自己执行乘法 100000个回路,最佳3个:每个回路2.57µs

  • 谷歌Colab:

    如何使TensorFlow模型在推理时间上更快?
    特别是因为我不仅有一个
    密集的
    层,而且我还使用了一个
    LSTM
    ,我不想在NumPy中重新实现它。

    整个故事都在Keras中实现LSTM层的背后。Keras LSTM层有一个默认参数
    unroll=False
    。这会导致LSTM运行符号循环(循环会导致更多时间)。尝试向LSTM添加一个额外的参数,如
    unroll=True

    tf.keras.layers.LSTM(64, return_sequences=True, stateful=True, unroll=True)
    

    这可能导致最高2倍的速度提升(在我的机器上测试,使用
    %timeit model(vec,training=False)
    )。但是,使用
    unroll=True
    可能会导致较大序列占用更多ram。欲了解更多信息,请查看Keras LSTM。

    您可以尝试使用批量训练,而不是针对每个样本优化模型。这不是训练时间,而是推断时间。我需要一次对一个样本尽可能快地建立我的模型你的结论完全不正确,第一种情况是你将输入转换为符号张量,而predict使用numpy数组,因此转换正在进行,这使得它变慢。第二种情况是只进行符号计算,这并不是您真正想要的。亲爱的@Dr.Snoopy,每次手术的
    结果都是完全相同的。我现在在colab中添加了这一点。我们不看colab,所有代码/结果都必须在您的问题中。谢谢您,这确实是正确的。添加
    unroll=True
    会将速度从3.4ms提高到2.3ms,但是,我的序列非常长(10000-50000),因此不适合。但我注意到的一件事是将
    return\u sequences
    更改为
    False
    实际上将时间更改为1.84ms,这是我可以使用的,抱歉,我没有注意到。是的,它确实会起作用。但是,我想通知您,您应该只在最后一个LSTM层(密集层之前)上使用
    return\u sequences=False
    。否则,您可能会获得性能提升,但会丢失一些重要功能。希望能有帮助。