我正在查看使用 Keras+TensorFlow 训练 CNN 模型期间的性能和 GPU 使用情况。类似这样的问题,我有一个很难理解的结合使用Keras的model.fit
的steps_per_epoch
和TensorFlow的数据集API的.batch()
:我设置一定的批量输入管道dataset = dataset.batch(batch_size)
,后来我用
fit = model.fit(dataset, epochs=num_epochs, steps_per_epoch=training_set_size//batch_size)
Run Code Online (Sandbox Code Playgroud)
但我看到实际上可以为每个 epoch 设置任意数量的步骤,甚至超过training_set_size//batch_size
. 从文档中我了解到,在 Keras 上,一个 epoch 并不一定像往常一样通过整个训练集,但无论如何我有点困惑,现在我不完全确定我是否正确使用它。
dataset.batch(batch_size)
+是否steps_per_epoch=training_set_size//batch_size
定义了通过小批量batch_size
样本在整个训练集上运行的小批量 SGD ?如果steps_per_epoch
设置为 大于 ,则 epoch 是否大于一次通过训练集training_set_size//batch_size
?
阅读这个 和这个答案,我明白对于 TensorFlow-2.0 上的非动态模型,Keras 将使用 AutoGraph。但是现在编写一个回调来获取训练期间变量的历史记录,
class TrainHistory(tf.keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.vars = []
def on_batch_end(self, batch, logs={}):
self.vars.append([v.numpy() for v in self.model.variables])
Run Code Online (Sandbox Code Playgroud)
我看到.numpy()
可以使用渴望张量的方法。我期待这样的错误numpy() is only available when eager execution is enabled
。将 Keras 与 TensorFlow-2.0 结合使用时,是否正在执行 Eager 代码?
这里提到,对于像卷积这样的计算密集型函数,与tf.function
Eager 代码相比,装饰函数的速度并没有太大提升,但从示例中显示的数字来看,我认为这种差异对于长时间训练可能意义重大。使用GradientTape
装饰的自定义训练函数tf.function
而不是 Keras 的fit()
方法在性能方面会更好吗?