MSE 作为顺序模型中的损失函数,当数据长度 > 批量大小时无法正常工作。
让我们从数据长度 < 32 开始。在这种情况下它工作正常,接下来我们将对数据中的另外 3 个值执行相同的操作。
首先我们获取数据,然后计算 MSE,然后运行我们的简单序列模型的一个 epoch,损失函数 = MSE。我们将在这里看到损失函数返回是正确的。
在第二步中,我们将使用另外 3 个值再次执行此操作。模型返回的 MSE 会有所不同。
import tensorflow as tf
import numpy as np
from tensorflow import keras
# tf version : 2.2.0
mse = tf.keras.losses.MeanSquaredError()
xs = np.arange(-10,20,1,dtype="float32")
# from -10. to 19.
def hw_function(x) :
return (2 * x) - 1
ys = np.apply_along_axis(hw_function, 0, xs)
# from -21. to 37.
# len(ys) = 30
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
# model.weights
# e.g random weights ) bias = 0
# [<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[1.6994196]], dtype=float32)>,
# <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
xxs=xs*model.weights[0][0][0]
mse(xxs, ys).numpy()
# MSE = 6.8929496
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(xs, ys, epochs=1)
# 1/1 [==============================] - 0s 2ms/step - loss: 6.8929
# <tensorflow.python.keras.callbacks.History at 0x7f9ab05130f0>
# we get MSE = 6.8929 that's perfect
我们做的完全一样,但是我们用 33 个值代替了 30 个值。当然权重是随机值
import tensorflow as tf
import numpy as np
from tensorflow import keras
# tf version : 2.2.0
mse = tf.keras.losses.MeanSquaredError()
xs = np.arange(-10,20,1,dtype="float32")
# from -10. to 22.
def hw_function(x) :
return (2 * x) - 1
ys = np.apply_along_axis(hw_function, 0, xs)
# from -21. to 43.
# len(ys) = 33
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
# model.weights
# e.g
# [<tf.Variable 'dense/kernel:0' shape=(1, 1) dtype=float32, numpy=array([[-1.1775365]], dtype=float32)>,
# <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>]
# bias = 0
xxs=xs*model.weights[0][0][0]
mse(xxs, ys).numpy()
# we get 1241.7897
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(xs, ys, epochs=1)
# 1/1 [==============================] - 0s 2ms/step - loss: 1249.6738
# <tensorflow.python.keras.callbacks.History at 0x7f9ab05130f0>
# we get MSE = 1249.6738 it's an error
这是我的问题。为什么,当数据长度 > 批量大小时,我们无法通过 MSE 获得正确的值作为顺序模型中的损失函数?
如果我使用 MAE 代替 MSE,它可以正常工作,当数据>批量大小时,模型返回的值是正确的。
它与批量大小有关。当数据长度 < 32 时,它工作正常(总是),但当它 > 32 时,每次 MSE 都会失败