您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么keras模型预测编译后会变慢?

为什么keras模型预测编译后会变慢?

更新:将实际答案发布为单独的答案;这篇文章包含补充信息

.compile() 设置大多数TF / Keras图,包括损失,度量,梯度,以及部分优化器及其权重-这可以确保显着的速度降低。

什么是意想不到的是经济放缓的程度-我自己的实验10倍,并且predict(),它不更新任何权重。查看TF2的源代码,图形元素似乎紧密地交织在一起,资源不一定“公平地”分配。

predict对于未编译的模型,开发人员可能会忽略其性能,因为通常使用已编译的模型-但实际上,这是无法接受的差异。因为有一个简单的解决方法,这也有可能是“必要的邪恶”(见下文)。

这不是一个完整的答案,我希望有人可以在这里提供它-如果不能,我建议在TensorFlow上打开Github问题。(OP有;这里)

解决方法:训练模型,保存其权重,无需编译即可重建模型,加载权重。千万不能挽救整个模型(例如model.save()),因为它会加载有编译-而不是使用model.save_weights()和model.load_weights()。

解决方法2:如上,但使用load_model(path, compile=False);建议信用:D。Möller

UPDATE:澄清,优化器不完全实例化compile,包括其weights与updates张量-这样做时,拟合函数的第一个电话由(fit,train_on_batch,等),通过model._make_train_function()。

因此观察到的行为更加奇怪。更糟糕的是,构建优化器不会引起任何进一步的减速(请参阅下文)-暗示“图形大小”不是此处的主要解释。

编辑:在某些型号上,速度降低30倍。TensorFlow,您做了什么。下面的例子:

from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
import numpy as np
from time import time

def timeit(func, arg, iterations):
    t0 = time()
    for _ in range(iterations):
        func(arg)
    print("%.4f sec" % (time() - t0))

ipt   = Input(shape=(4,))
x     = Dense(2, activation='relu')(ipt)
out   = Dense(1, activation='sigmoid')(x)
model = Model(ipt, out)

X = np.random.randn(32,4)

timeit(model.predict, X, 1000)
model.compile('adam', loss='binary_crossentropy')
timeit(model.predict, X, 1000)
model._make_train_function()  # build optimizer
timeit(model.predict, X, 1000)

输出

0.9891 sec
29.785 sec
29.521 sec
其他 2022/1/1 18:30:44 有511人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶