Python 如何在TensorFlow 2.0中控制冗长

Python 如何在TensorFlow 2.0中控制冗长,python,tensorflow,neural-network,tensorflow2.0,Python,Tensorflow,Neural Network,Tensorflow2.0,在TensorFlow 1.x中,我可以自由选择如何以及何时打印训练期间的准确度/损失分数。例如,如果我想每100个时代打印一次培训损失,在tf.Session()中,我会写: if epoch % 100 == 0: print(str(epoch) + '. Training Loss: ' + str(loss)) TF2.0(alpha)发布后,KerasAPI似乎不得不坚持其标准输出。有没有办法恢复这种灵活性?如果您不使用Keras模型方法(.fit,.train\u on\

在TensorFlow 1.x中,我可以自由选择如何以及何时打印训练期间的准确度/损失分数。例如,如果我想每100个时代打印一次培训损失,在
tf.Session()
中,我会写:

if epoch % 100 == 0:
    print(str(epoch) + '. Training Loss: ' + str(loss))

TF2.0(alpha)发布后,KerasAPI似乎不得不坚持其标准输出。有没有办法恢复这种灵活性?

如果您不使用Keras模型方法(
.fit
.train\u on\u batch
,…),您可以使用急切执行编写自己的训练循环(并可以选择将其包装在
tf.function
中,以图形表示形式进行转换)您可以像在1.x中那样控制冗长

training_epochs = 10
step = 0
for epoch in range(training_epochs)
    print("starting ",epoch)
    for features, labels in dataset:
        with tf.GradientTape() as tape:
            loss = compute_loss(model(features),labels)
        gradients = tape.gradients(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(gradients, model.trainable_variables))
        step += 1
        if step % 10 == 0:
            # measure other metrics if needed
            print("loss: ", loss)
    print("Epoch ", epoch, " finished.")

太好了。我还有其他问题:1)compute_loss()函数来自哪里?;2) 第5行和第6行是否应在带块的
中?;3) 我在哪里可以控制纪元的数量?非常感谢。(谢谢!)
compute\u loss
只是伪代码。用你的损失来代替它(如果可能,来自tf.keras.loss)。不,5线和6线可以在渐变带外。磁带仅用于注册操作(并且您执行了前向传递调用模型和损失计算)。因为您正在迭代一个数据集,所以您可以通过许多不同的方式来控制这些时代:手动,知道数据集的大小。或者,如果
数据集
tf.data.dataset
对象,则可以使用
.repeat(n)
方法使数据集在第2行重复n个时代:
以输入数据集
dataset
是numpy对象吗?如果是这样的话,它看起来就像随机GD一样,一次只走一行。如果我想实现简单的GD,我可以为范围内的历元(num_epochs)编写:
并将我的
数据集
放在输入中吗?感谢是一件令人难以忍受的事情。看看如何
tf.data.Dataset
文档(但它甚至可以是numpy)。要实现一个简单的训练循环,请看这个示例。但是,是的,您可以在另一个循环中执行类似于“for epoch in range(num_epochs)”,该循环在我更新示例后遍历数据集-看一看。顺便说一句,dataset是一个iterable,您可以让它返回您想要的任何内容。在我的例子中,我假设它返回一对
(特性、标签)