我有使用未编译的Keras代码构建的模型,并尝试通过自定义训练循环运行它们。
默认情况下,TF 2.0 eager代码在CPU(笔记本电脑)上运行约30秒。当我使用包装tf.function调用方法创建keras模型时,它的运行速度要慢得多,似乎需要很长时间才能启动,特别是“第一次”。
例如,在tf.function代码中,10个样本的初始训练需要40秒,后续训练只需2秒。
在20个样本上,初始训练需要50秒,后续训练需要4秒。
第一次1个样本的训练需要2秒,后续训练需要200毫秒。
因此,每次train的调用似乎都会创建一个新图形,其中复杂性随着train计数而增加!?
我只是做了这样的事:
@tf.function
def train(n=10):
step = 0
loss = 0.0
accuracy = 0.0
for i in range(n):
step += 1
d, dd, l = train_one_step(model, opt, data)
tf.print(dd)
with tf.name_scope('train'):
for k in dd:
tf.summary.scalar(k, dd[k], step=step)
if tf.equal(step % 10, 0):
tf.print(dd)
d.update(dd)
return d
模型是keras.model.Model
,其具有像示例中那样使用@tf.function
修饰的call
方法。