【问题标题】:How to customize what happen in fit method in tensorflow 2.0如何在 tensorflow 2.0 中自定义 fit 方法中发生的事情
【发布时间】:2021-02-26 19:32:00
【问题描述】:

我正在研究如何使用 tensorflow 2.0 自定义 fit 方法中发生的事情,我正在关注此链接:https://www.tensorflow.org/guide/keras/customizing_what_happens_in_fit,但我注意到上一个链接的代码有所不同;特别是它首先以这种方式训练模型:

with tf.GradientTape() as tape:
           y_pred = self(x, training=True)  # Forward pass
           # Compute the loss value
           # (the loss function is configured in `compile()`)
           loss = self.compiled_loss(y, y_pred, regularization_losses=self.losses)
           print(loss)

在这之后:

with tf.GradientTape() as tape:
            y_pred = self(x, training=True)  # Forward pass
            # Compute our own loss
            loss = keras.losses.mean_squared_error(y, y_pred)
            print(loss.shape)

如您所见,不同之处在于损失函数的计算:在第一个块中,他们使用编译的损失函数,而在第二个块中,损失是使用mean_squared_error 函数计算的。 当我检查损失的形状时,我产生了疑问:在第一种情况下,它是一个像这样的标量:(tf.Tensor(0.21193008, shape=(), dtype=float32),而在第二种情况下,打印语句给了我一个形状为(32,) 的张量。 我的想法是,在第二种情况下,不计算批次的平均值,我不知道为什么。 我使用tf.reduce_mean 解决了,但我不确定它是否正确。但是损失应该是一个标量,因此我不明白没有tf.reduce_mean 的第二种模式如何工作,以及该语句的使用是否正确。

【问题讨论】:

    标签: python tensorflow keras deep-learning tensorflow2.0


    【解决方案1】:

    根据 keras 文档

    https://keras.io/api/losses/regression_losses/#meansquarederror-function

    keras.losses.mean_squared_error(y, y_pred)

    这仅计算最后一个维度的损失,并且输出确实包含批量大小维度。只有最后一个维度消失了。

    【讨论】:

    • 我知道这一点,但我不明白为什么在link 他们只使用keras.losses.mean_squared_error(y, y_pred) 而不减少批量大小(使用编译损失或tf.reduce_mean 减少)。是 tensorflow 页面的错误还是我错过了什么?
    • 通常你使用批量梯度下降,其中整个批次的损失平均值用于更新权重,但你也可以使用随机梯度下降,其中每个样本都有自己的损失,这样你的模型将根据每个样本批量更新权重。
    • 所以你是说第一个代码块和第二个代码块之间的唯一区别是,第一个代码块使用经典的小批量随机梯度下降,第二个使用随机梯度下降,对吧?
    猜你喜欢
    • 1970-01-01
    • 2016-08-11
    • 2020-05-20
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2020-12-07
    相关资源
    最近更新 更多