我有从未编译的keras代码构建的模型,并且正在尝试通过自定义训练循环运行它们。
TF 2.0急切(默认)代码在CPU(笔记本电脑)上运行约30秒钟。当我用包装的tf.function调用方法创建一个keras模型时,它运行的速度非常慢,而且启动时间似乎很长,尤其是“第一次”。
例如,在tf.function代码中,对10个样本的初始训练花费40s,而对10个样本的后续训练花费2s。
在20个样本上,初始花费50s,后续花费4s。
第一次采样1个样本需要2秒钟,后续过程需要200毫秒。
如此看来,每次火车呼叫都在创建一个新图,其中复杂度随火车数量而增加!
我只是在做这样的事情:
@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
Run Code Online (Sandbox Code Playgroud)
根据示例,模型keras.model.Model使用@tf.function装饰call方法。