gpt4 book ai didi

python - 训练 MSE 损失大于理论最大值?

转载 作者:行者123 更新时间:2023-12-04 12:00:25 29 4
gpt4 key购买 nike

我正在训练一个 keras 模型,它的最后一层是单个 sigmoid单元:

output = Dense(units=1, activation='sigmoid')
我正在用一些训练数据训练这个模型,其中预期输出总是介于 0.0 和 1.0 之间的数字。
我正在用均方误差编译模型:
model.compile(optimizer='adam', loss='mse')
由于预期输出和实际输出都是介于 0 和 1 之间的单个浮点数,因此我预计也会在 0 和 1 之间出现损失,但是当我开始训练时,我得到的损失为 3.3932 ,大于 1。
我错过了什么吗?
编辑:
我正在添加一个示例来显示问题:
https://drive.google.com/file/d/1fBBrgW-HlBYhG-BUARjTXn3SpWqrHHPK/view?usp=sharing
(我不能只粘贴代码,因为我需要附加训练数据)
运行后 python stackoverflow.py ,将显示模型的摘要以及训练过程。
我还在每一步打印 y_true 的最小值和最大值,以验证它们是否在 [0, 1] 范围内。
无需等待训练完成,您会看到前几个 epoch 的损失远大于 1。

最佳答案

首先,我们可以揭开mse损失 - 这是 tf.keras 中的正常可调用函数:

import tensorflow as tf
import numpy as np

mse = tf.keras.losses.mse
print(mse([1] * 3, [0] * 3)) # tf.Tensor(1, shape=(), dtype=int32)
接下来,正如名称“均方误差”所暗示的那样,它是一个均值,这意味着只要均值相同,传递给它的向量的大小就不会改变该值: print(mse([1] * 10, [0] * 10)) # tf.Tensor(1, shape=(), dtype=int32)为了 mse要超过 1,平均误差必须超过 1:
print( mse(np.random.random((100,)), np.random.random((100,))) )  # tf.Tensor(0.14863832582680103, shape=(), dtype=float64)
print( mse( 10 * np.random.random((100,)), np.random.random((100,))) ) # tf.Tensor(30.51209646429651, shape=(), dtype=float64)
最后,sigmoid 确实保证输出在 0 和 1 之间:
sigmoid = tf.keras.activations.sigmoid
signal = 10 * np.random.random((100,))

output = sigmoid(signal)
print(f"Raw: {np.mean(signal):.2f}; Sigmoid: {np.mean(output):.2f}" ) # Raw: 5.35; Sigmoid: 0.92
这意味着在您的代码中, y_true 的平均值不在 0 和 1 之间。
您可以使用 np.mean(y_true) 验证这一点.

关于python - 训练 MSE 损失大于理论最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63655484/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com