在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的最佳实践是什么?我还没有找到完整的教程。
答案 0 :(得分:2)
使用最能满足您需求的东西。
这两种方法在Tensorflow教程中都有介绍。
如果您不需要任何特殊的东西,没有额外的损失,奇怪的度量标准或复杂的梯度计算,只需使用model.fit()
或model.fit_generator()
。这完全可以,让您的生活更轻松。
当您使用复杂的模型进行不重要的损失/梯度计算时,自定义训练循环可能会派上用场。
到目前为止,我尝试过的两个应用程序更容易实现:
y_true
值的损失函数,并且每种情况仅应更新模型的一部分)-另一个选项将需要具有几个单独的模型,每个模型都有自己的模型trainable=True/False
配置,然后在不同的阶段进行训练。