Tensorflow 2.0最佳实践(培训步骤)

时间:2019-09-27 16:01:51

标签: tensorflow keras deep-learning

在tensorflow 2.0中,您不必担心训练阶段(批处理大小,历元数等),因为一切都可以在compile方法中定义:model.fit(X_train,Y_train,batch_size = 64,epochs = 100)

但是我看到了以下代码样式:

optimizer = tf.keras.optimizers.Adam(0.001)
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy()

@tf.function
def train_step(inputs, labels):
  with tf.GradientTape() as tape:
    predictions = model(inputs, training=True)
    regularization_loss = tf.math.add_n(model.losses)
    pred_loss = loss_fn(labels, predictions)
    total_loss = pred_loss + regularization_loss

  gradients = tape.gradient(total_loss, model.trainable_variables)
  optimizer.apply_gradients(zip(gradients, model.trainable_variables))

for epoch in range(NUM_EPOCHS):
  for inputs, labels in train_data:
    train_step(inputs, labels)
  print("Finished epoch", epoch)

因此,您可以在此处观察“更详细的”代码,在其中您可以通过for循环手动定义培训过程。

我有以下问题:Tensorflow 2.0的最佳实践是什么?我还没有找到完整的教程。

1 个答案:

答案 0 :(得分:2)

使用最能满足您需求的东西。

这两种方法在Tensorflow教程中都有介绍。

如果您不需要任何特殊的东西,没有额外的损失,奇怪的度量标准或复杂的梯度计算,只需使用model.fit()model.fit_generator()。这完全可以,让您的生活更轻松。

当您使用复杂的模型进行不重要的损失/梯度计算时,自定义训练循环可能会派上用场。

到目前为止,我尝试过的两个应用程序更容易实现:

  • 同时训练GAN的生成器和鉴别器,而无需执行两次生成步骤。 (这很复杂,因为您具有适用于不同y_true值的损失函数,并且每种情况仅应更新模型的一部分)-另一个选项将需要具有几个单独的模型,每个模型都有自己的模型trainable=True/False配置,然后在不同的阶段进行训练。
  • 训练输入(适用于样式转换模型)-或者,创建一个自定义图层,该图层接受虚拟输入并输出自己的可训练权重。但是,为基本和样式网络的每个输出编译几个损失函数会变得很复杂。